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

React在定時(shí)器中無(wú)法獲取狀態(tài)最新值的問(wèn)題

 更新時(shí)間:2022年08月08日 14:46:45   作者:前端常春藤  
這篇文章主要介紹了React在定時(shí)器中無(wú)法獲取狀態(tài)最新值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在定時(shí)器中無(wú)法獲取狀態(tài)最新值

在做輪播圖組件時(shí)發(fā)現(xiàn)了一個(gè)問(wèn)題,在setInterval中無(wú)法通過(guò)狀態(tài)直接獲取最新值,如:

const [rightTransform, setRightTransform] = useState(pictureSize);

const autoPlay = () => {        //普通輪播自動(dòng)播放
    timer.current = setInterval(() => {
      let oldState = rightTransform;
      console.log('老狀態(tài)', oldState)			//始終只會(huì)打印初始的pictureSize
      setRightTransform(o => {
        const newState = JSON.parse(JSON.stringify(o));
        return newState >= (renderImgList.length) * pictureSize ? 0 : newState + pictureSize
      })
	}, 1000);
}

問(wèn)題原因

定時(shí)器一直都沒(méi)有被清除,因此獲取的狀態(tài)始終是定時(shí)器被創(chuàng)建時(shí)候的狀態(tài)。

問(wèn)題解決

從代碼和圖片可以看到,定時(shí)器中打印的狀態(tài)永遠(yuǎn)都是初始值,后面所改變的值雖然更新了,頁(yè)面也發(fā)生了變化,但是我們從log中無(wú)法獲取到實(shí)時(shí)狀態(tài)。

解決辦法很簡(jiǎn)單:

第一種,就是在setState中獲取上一次狀態(tài),因?yàn)閡seState hooks提供了記錄上一次狀態(tài)的緩存回調(diào),可以在這個(gè)回調(diào)中獲取上一輪狀態(tài)

如圖:

timer.current = setInterval(() => {
      let oldState = rightTransform;
      setRightTransform(o => {
        console.log('在setState中的老狀態(tài)', o)
        const newState = JSON.parse(JSON.stringify(o));
        return newState >= (renderImgList.length) * pictureSize ? 0 : newState + pictureSize
      })
      console.log('直接打印老狀態(tài)', oldState)
}

ReactHook hooks和定時(shí)器產(chǎn)生的bug

問(wèn)題1

使用定時(shí)器改變state,state的值并不是最新值

例:

?const _onClick = function ()
?{
? ?setInterval(() => {
? ? ?console.log(value);
? ? ?setValue(value + 1);
? ?},1000)
?}

產(chǎn)生原因:因?yàn)槊看蝧etValue后會(huì)重新創(chuàng)建函數(shù),由于并沒(méi)有及時(shí)清理掉setInterval,setInterval執(zhí)行的上下文環(huán)境都是第一次創(chuàng)建本函數(shù)式組件的上下文(所以value值不會(huì)超過(guò)1)

解決方案        

方案一:

setInterval(() => {
? ? ?console.log(value);
? ? ?setValue(v=>v+1); ? ? ?函數(shù)式的setValue會(huì)保存上一次的值,所以會(huì)取得最新值,該方式指定state該如何改變而不用引用當(dāng)前state
? ?},1000)

    

方案二:

useEffect(() => {
? ? ?const id = setInterval(() => {
? ? ? ? ?valf.current++; ? ?不一定是ref操作,正常set操作即可
? ? ? ?}, 1000);
? ? ? ?return () => clearInterval(id);
? ?}, []);

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

相關(guān)文章

  • React中如何使用scss

    React中如何使用scss

    這篇文章主要介紹了React中如何使用scss問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • React?狀態(tài)管理工具優(yōu)劣勢(shì)示例分析

    React?狀態(tài)管理工具優(yōu)劣勢(shì)示例分析

    這篇文章主要為大家介紹了React?狀態(tài)管理工具優(yōu)劣勢(shì)示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • react配置webpack-bundle-analyzer項(xiàng)目?jī)?yōu)化踩坑記錄

    react配置webpack-bundle-analyzer項(xiàng)目?jī)?yōu)化踩坑記錄

    這篇文章主要介紹了react配置webpack-bundle-analyzer項(xiàng)目?jī)?yōu)化踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解React中的todo-list

    詳解React中的todo-list

    這篇文章主要介紹了React中的todo-list的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • TypeScript在React中的應(yīng)用技術(shù)實(shí)例解析

    TypeScript在React中的應(yīng)用技術(shù)實(shí)例解析

    這篇文章主要為大家介紹了TypeScript在React中的應(yīng)用技術(shù)實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • react中axios結(jié)合后端實(shí)現(xiàn)GET和POST請(qǐng)求方式

    react中axios結(jié)合后端實(shí)現(xiàn)GET和POST請(qǐng)求方式

    這篇文章主要介紹了react中axios結(jié)合后端實(shí)現(xiàn)GET和POST請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 深入理解react-router@4.0 使用和源碼解析

    深入理解react-router@4.0 使用和源碼解析

    這篇文章主要介紹了深入理解react-router@4.0 使用和源碼解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • React經(jīng)典面試題之倒計(jì)時(shí)組件詳解

    React經(jīng)典面試題之倒計(jì)時(shí)組件詳解

    這些天也都在面試,面試的內(nèi)容也大多千篇一律,無(wú)外乎vue、react這些框架的一些原理,和使用方法,但是也遇到些有趣的題目,這篇文章主要給大家介紹了關(guān)于React經(jīng)典面試題之倒計(jì)時(shí)組件的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • React Native 圖片查看組件的方法

    React Native 圖片查看組件的方法

    這篇文章主要介紹了React Native 圖片查看組件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • React傳遞參數(shù)的幾種方式

    React傳遞參數(shù)的幾種方式

    本文詳細(xì)的介紹了React傳遞參數(shù)的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06

最新評(píng)論

上蔡县| 上林县| 乌拉特前旗| 德安县| 滁州市| 百色市| 高邑县| 基隆市| 谢通门县| 武冈市| 桂林市| 清镇市| 奎屯市| 昔阳县| 苏尼特左旗| 平果县| 巴里| 郓城县| 奉贤区| 习水县| 普陀区| 托克逊县| 麻栗坡县| 泰兴市| 谢通门县| 固镇县| 巴楚县| 木兰县| 大田县| 镇原县| 濮阳市| 揭东县| 昌宁县| 伊金霍洛旗| 永和县| 万全县| 阿荣旗| 淳化县| 宜城市| 湖南省| 乌兰县|