最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于react hook useState連續(xù)更新對象的問題

 更新時(shí)間:2024年03月13日 09:03:09   作者:Bearbearssss  
這篇文章主要介紹了關(guān)于react hook useState連續(xù)更新對象的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

react hook useState連續(xù)更新對象

react hook 的useState更新是異步的,所以在連續(xù)更新出發(fā)useState時(shí)會出現(xiàn)問題

eg:

import React, {useState} from 'react';
 
export default () => {
    const [obj, setObj] = useState({
        a: 1,
        b: 2
      })
 
    const changeObj = () => {
        // 連續(xù)觸發(fā)2次setObj(實(shí)際項(xiàng)目不會這樣寫,我這樣寫只是為了模擬連續(xù)觸發(fā)2次setObj帶來的問題)
        setObj({...obj, a: 2})
        setObj({...obj, b: 3}) 
    }
   return (<div onClick={changeObj}>
          // 此時(shí)頁面上顯示的值為 {a: 1, b: 3}, 出現(xiàn)該問題的原因是因?yàn)閡seState是異步的,在第二次觸發(fā)setObj時(shí),obj還是沒更新a之前的obj,所以出現(xiàn)該結(jié)果
            {JSON.stringify(obj)}
           </div>)
}

解決此情況的方式

就是在第二次觸發(fā)時(shí)使用

setObj((data) => ({...data, b: 3})) 

這樣的方式

import React, {useState} from 'react';
 
export default () => {
    const [obj, setObj] = useState({
        a: 1,
        b: 2
      })
 
    const changeObj = () => {
        // 連續(xù)觸發(fā)2次setObj(實(shí)際項(xiàng)目不會這樣寫,為了模擬情況)
        setObj({...obj, a: 2})
        // data標(biāo)識存儲的是更新a后的對象,用這樣的方式可以解決連續(xù)觸發(fā)2次帶來的問題
        setObj((data) => ({...data, b: 3})) 
    }
   return (<div onClick={changeObj}>
          // 此時(shí)頁面上顯示的值為 {a: 2, b: 3}
            {JSON.stringify(obj)}
           </div>)
}

react hook使用useState()更新狀態(tài)(state)異步導(dǎo)致不能及時(shí)讀取更新之后的數(shù)據(jù)

場景描述

我在更新一個(gè)狀態(tài)之后要立馬用這個(gè)狀態(tài)去更新其他狀態(tài)

我的源代碼

const onChange = (nextTargetKeys: any) => {
//更新狀態(tài)
    setTargetKeys(nextTargetKeys);
    let v = 0;
    let n = 0;
    let g = 0;
    //立馬使用
   targetKeys.forEach((item: number, index) => {
      v += mockData[item].itemVolume;
      n += mockData[item].itemNw;
      g += mockData[item].itemGw;
    });
       setTopData({ v: Number((v/1000000).toFixed(4)), n: n, g: g });
  };

如果是vue,這里是沒有問題的 ,但是這是react~這里的數(shù)據(jù)還沒更新,取到的還是舊數(shù)據(jù)

這里加個(gè)setTimeout延遲執(zhí)行就是新的數(shù)據(jù)。這是為什么了?

原因:

vue是同步更新狀態(tài),異步視圖,當(dāng)狀態(tài)變化是阻塞更新完成之后執(zhí)行后繼邏輯,

react是異步更新狀態(tài),setState 是異步方法,所以不會阻塞!

處理辦法

添加一個(gè) 副作用(useEffect()

  useEffect(()=>{
    let v = 0;
    let n = 0;
    let g = 0;
    targetKeys.forEach((item: number, index) => {
      v += mockData[item].itemVolume;
      n += mockData[item].itemNw;
      g += mockData[item].itemGw;
      console.log(v)
    });
    setTopData({ v: Number((v/1000000).toFixed(4)), n: n, g: g });
     },[targetKeys])

順便發(fā)表感受,還是vue的狀態(tài)更新直接、簡便!

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • 詳解React-Todos入門例子

    詳解React-Todos入門例子

    本篇文章主要介紹了React-Todos入門例子,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • React18的useEffect執(zhí)行兩次如何應(yīng)對

    React18的useEffect執(zhí)行兩次如何應(yīng)對

    這篇文章主要給大家介紹了關(guān)于React18的useEffect執(zhí)行兩次如何應(yīng)對的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用React具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 使用hooks寫React組件需要注意的5個(gè)地方

    使用hooks寫React組件需要注意的5個(gè)地方

    這篇文章主要介紹了使用hooks寫React組件需要注意的5個(gè)地方,幫助大家更好的理解和學(xué)習(xí)使用React組件,感興趣的朋友可以了解下
    2021-04-04
  • 解決React報(bào)錯(cuò)The?tag?is?unrecognized?in?this?browser

    解決React報(bào)錯(cuò)The?tag?is?unrecognized?in?this?browser

    這篇文章主要為大家介紹了解決React報(bào)錯(cuò)The?tag?is?unrecognized?in?this?browser示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React項(xiàng)目中報(bào)錯(cuò):Parsing error: The keyword 'import' is reservedeslint的問題及解決方法

    React項(xiàng)目中報(bào)錯(cuò):Parsing error: The keyword &a

    ESLint 默認(rèn)使用的是 ES5 語法,如果你想使用 ES6 或者更新的語法,你需要在 ESLint 的配置文件如:.eslintrc.js等中設(shè)置 parserOptions,這篇文章主要介紹了React項(xiàng)目中報(bào)錯(cuò):Parsing error: The keyword 'import' is reservedeslint的問題及解決方法,需要的朋友可以參考下
    2023-12-12
  • ReactJS中不同類型的狀態(tài)詳解

    ReactJS中不同類型的狀態(tài)詳解

    這篇文章主要為大家介紹了ReactJS中不同類型的狀態(tài)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React實(shí)現(xiàn)下拉框的key,value的值同時(shí)傳送

    React實(shí)現(xiàn)下拉框的key,value的值同時(shí)傳送

    這篇文章主要介紹了React實(shí)現(xiàn)下拉框的key,value的值同時(shí)傳送方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React Fiber源碼深入分析

    React Fiber源碼深入分析

    Fiber 可以理解為一個(gè)執(zhí)行單元,每次執(zhí)行完一個(gè)執(zhí)行單元,React Fiber就會檢查還剩多少時(shí)間,如果沒有時(shí)間則將控制權(quán)讓出去,然后由瀏覽器執(zhí)行渲染操作,這篇文章主要介紹了React Fiber架構(gòu)原理剖析,需要的朋友可以參考下
    2022-11-11
  • React?中的列表渲染要加?key的原因分析

    React?中的列表渲染要加?key的原因分析

    這篇文章主要介紹了React?中的列表渲染為什么要加?key,在?React?中我們經(jīng)常需要渲染列表,比如展示好友列表,文中給大家介紹了列表渲染不提供?key?會如何,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友一起看看吧
    2022-07-07
  • React運(yùn)行機(jī)制超詳細(xì)講解

    React運(yùn)行機(jī)制超詳細(xì)講解

    React 作為當(dāng)下最為流行的前端開發(fā)框架之一,使用它可以快速構(gòu)建大型 Web 應(yīng)用,加上其出色的性能表現(xiàn),使得眾多互聯(lián)網(wǎng)公司對它格外地青睞,這篇文章主要介紹了React運(yùn)行機(jī)制
    2022-11-11

最新評論

敦煌市| 奇台县| 德阳市| 云林县| 兴化市| 辉南县| 通渭县| 岢岚县| 洪湖市| 深圳市| 高碑店市| 海安县| 蓝山县| 枞阳县| 杂多县| 兴业县| 阜新| 信宜市| 临西县| 西丰县| 饶河县| 怀柔区| 托克逊县| 大悟县| 黄梅县| 会泽县| 滦平县| 昭通市| 平罗县| 瑞丽市| 灵武市| 扬州市| 项城市| 卢湾区| 凤翔县| 汝南县| 景洪市| 高要市| 滦南县| 黄山市| 息烽县|