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

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

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

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

react hook 的useState更新是異步的,所以在連續(xù)更新出發(fā)useState時(shí)會(huì)出現(xiàn)問(wè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)目不會(huì)這樣寫(xiě),我這樣寫(xiě)只是為了模擬連續(xù)觸發(fā)2次setObj帶來(lái)的問(wèn)題)
        setObj({...obj, a: 2})
        setObj({...obj, b: 3}) 
    }
   return (<div onClick={changeObj}>
          // 此時(shí)頁(yè)面上顯示的值為 {a: 1, b: 3}, 出現(xiàn)該問(wèn)題的原因是因?yàn)閡seState是異步的,在第二次觸發(fā)setObj時(shí),obj還是沒(méi)更新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)目不會(huì)這樣寫(xiě),為了模擬情況)
        setObj({...obj, a: 2})
        // data標(biāo)識(shí)存儲(chǔ)的是更新a后的對(duì)象,用這樣的方式可以解決連續(xù)觸發(fā)2次帶來(lái)的問(wèn)題
        setObj((data) => ({...data, b: 3})) 
    }
   return (<div onClick={changeObj}>
          // 此時(shí)頁(yè)面上顯示的值為 {a: 2, b: 3}
            {JSON.stringify(obj)}
           </div>)
}

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

場(chǎng)景描述

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

我的源代碼

const onChange = (nextTargetKeys: any) => {
//更新?tīng)顟B(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,這里是沒(méi)有問(wèn)題的 ,但是這是react~這里的數(shù)據(jù)還沒(méi)更新,取到的還是舊數(shù)據(jù)

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

原因:

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

react是異步更新?tīng)顟B(tài),setState 是異步方法,所以不會(huì)阻塞!

處理辦法

添加一個(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ǎn)便!

總結(jié)

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

相關(guān)文章

  • 詳解React-Todos入門(mén)例子

    詳解React-Todos入門(mén)例子

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

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

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

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

    這篇文章主要介紹了使用hooks寫(xiě)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的問(wèn)題及解決方法

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

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

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

    這篇文章主要為大家介紹了ReactJS中不同類(lèi)型的狀態(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à)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React Fiber源碼深入分析

    React Fiber源碼深入分析

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

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

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

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

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

最新評(píng)論

淮滨县| 莱芜市| 民丰县| 黔江区| 丰原市| 乐陵市| 凤翔县| 临洮县| 莎车县| 武宣县| 东港市| 黎平县| 绵竹市| 涞水县| 双峰县| 微博| 金昌市| 甘南县| 镇巴县| 恩施市| 利辛县| 壤塘县| 武穴市| 武威市| 盐源县| 腾冲县| 南陵县| 西昌市| 祥云县| 抚宁县| 天镇县| 永和县| 紫云| 阜南县| 万荣县| 鄱阳县| 万源市| 泽库县| 天津市| 多伦县| 永宁县|