" />

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

關于react useState更新異步問題

 更新時間:2022年08月08日 08:59:11   作者:Richard Yates Boy  
這篇文章主要介紹了關于react useState更新異步問題,具有很好的參考價值,希望對大家有所幫助。以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

react useState更新異步

當我們使用react中useState這個hook時候,如下

const [page, setPage] = useState(1);
const handlerClick = (e)=>{
?? ?setPage(e.current);
?? ?console.log(page);
}

當我打印page時候,此時page還是1,因為useState的更新是異步的,這和react的機制有關,要解決這個可以這樣做

1.使用useState的返回值

?setPage(e.current);
? ? ? ? setPage(prevFoo => {
? ? ? ? ? ? console.log('page===========',prevFoo);//page=========== 2
? ? ? ? ? ? return prevFoo;
?});

2.自定義hook(第一種方式)

? ? const useSyncCallback = callback => {
? ? ? ? const [proxyState, setProxyState] = useState({ current: false });
? ? ? ? const Func = useCallback(() => {
? ? ? ? ? setProxyState({ current: true });
? ? ? ? }, [proxyState]);
? ? ? ? useEffect(() => {
? ? ? ? ? if (proxyState.current === true) {
? ? ? ? ? ? setProxyState({ current: false });
? ? ? ? ? }
? ? ? ? }, [proxyState]);
? ? ? ? useEffect(() => {
? ? ? ? ? proxyState.current && callback();
? ? ? ? });
? ? ? ? return Func;
? ? ? };
? ? ? const funcqq = useSyncCallback(() => {
? ? ? ? console.log('page===========',page);//page=========== 2
? ? ? });
//調用
setPage(e.current);
funcqq()

自定義hook(第二種方式)

function useCurrentValue(value) {
? ? const ref = useRef(value);
? ? useEffect(() => {
? ? ? ref.current = value;
? ? }, [value]);
? ? return ref;
}
//調用
?const log = () => {
? ? setCount(count + 1);
? ? setTimeout(() => {
? ? ? console.log(currentCount.current);
? ? }, 3000);
? };

3.使用useRef替代useState,第三種方式在自定義hook第二種方式里面已經體現(xiàn)了

4.使用useEffect,在自定義hook第二種方式里面已經體現(xiàn)了

記useState異步更新小坑

問題

在hooks中,修改狀態(tài)的是通過useState返回的修改函數實現(xiàn)的.它的功能類似于class組件中的this.setState().而且,這兩種方式都是異步的.可是this.setState()是有回調函數的,那useState()呢?

問題點

它異步且沒有回調函數

const [count,setCount] = useState(1)
useEffect(()=> {
    setCount(2,()=>{
      console.log('測試hooks的回調');
    })
    console.log(count);
  },[])

打印信息

可以看到提示 “State updates from the useState() and useReducer() Hooks don’t support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().”

是不支持回調函數的形式的。因為setCount是異步的,所以打印count是在改變count之前的。

如果我們想要在打印的時候就拿到最新的值,那么我們可以通過setCount的第二個參數指定依賴項

const [count,setCount] = useState(1)
useEffect(()=> {
    setCount(2)
    console.log(count);
  },[count])

當count發(fā)生變化的時候,useEffect就會再次相應,但是這樣就會有個問題,當count從1變?yōu)?的時候useEffect的回調函數會再次執(zhí)行,就會分別打印1,2兩次。

  useEffect(()=> {
    let currentValue = null
      setCount((preVal)=>{
        currentValue=preVal
        return 2
      })
      if(currentValue!==count){
        console.log(count);
      }
    },[count])

通過添加判斷條件,我們可以讓想要執(zhí)行的代碼只執(zhí)行一次

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • React使用ref進行訪問DOM元素或組件

    React使用ref進行訪問DOM元素或組件

    在 React 里,ref 就像是一個神奇的小助手,能讓你直接去訪問 DOM 元素或者組件實例,下面就跟隨小編一起來學習一下具體的使用方法吧
    2025-03-03
  • React Hook 父子組件相互調用函數方式

    React Hook 父子組件相互調用函數方式

    這篇文章主要介紹了React Hook 父子組件相互調用函數方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實例分析

    React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實例分析

    這篇文章主要介紹了React Native中ScrollView組件輪播圖與ListView渲染列表組件用法,結合實例形式詳細分析了ScrollView組件輪播圖與ListView渲染列表組件具體功能、使用方法與操作注意事項,需要的朋友可以參考下
    2020-01-01
  • react-redux action傳參及多個state處理的實現(xiàn)

    react-redux action傳參及多個state處理的實現(xiàn)

    本文主要介紹了react-redux action傳參及多個state處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 深入掌握 react的 setState的工作機制

    深入掌握 react的 setState的工作機制

    本篇文章主要介紹了深入掌握 react的 setState的工作機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 為react組件庫添加typescript類型提示的方法

    為react組件庫添加typescript類型提示的方法

    這篇文章主要介紹了為react組件庫添加typescript類型提示,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • antd4里table滾動的實現(xiàn)

    antd4里table滾動的實現(xiàn)

    本文主要介紹了antd4里table滾動的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 詳解create-react-app 2.0版本如何啟用裝飾器語法

    詳解create-react-app 2.0版本如何啟用裝飾器語法

    這篇文章主要介紹了詳解create-react-app 2.0版本如何啟用裝飾器語法,cra2.0時代如何啟用裝飾器語法呢? 我們依舊采用的是react-app-rewired, 通過劫持webpack cofig對象, 達到修改的目的
    2018-10-10
  • react+antd+upload結合使用示例

    react+antd+upload結合使用示例

    這篇文章主要為大家介紹了react+antd+upload結合使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • redux的原理、工作流程及其應用方式

    redux的原理、工作流程及其應用方式

    這篇文章主要介紹了redux的原理、工作流程及其應用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論

枣阳市| 昔阳县| 东安县| 泸水县| 绥江县| 黄骅市| 浦北县| 衡阳县| 公主岭市| 古丈县| 博湖县| 馆陶县| 邻水| 永仁县| 高唐县| 左云县| 平顺县| 新疆| 布拖县| 昭平县| 天水市| 屯昌县| 扶沟县| 岳西县| 滦南县| 思茅市| 休宁县| 汉阴县| 伊金霍洛旗| 化州市| 靖州| 正阳县| 昆明市| 民权县| 克什克腾旗| 比如县| 股票| 夏邑县| 庆云县| 广昌县| 内黄县|