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

解決react中useState狀態(tài)異步更新的問(wèn)題

 更新時(shí)間:2022年07月05日 10:18:10   作者:Melody_lw  
本文主要介紹了react中useState狀態(tài)異步更新的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

疑惑

相信剛開(kāi)始使用react函數(shù)組件的小伙伴也遇到過(guò)一個(gè)坑,就是 useState 更新?tīng)顟B(tài)是異步更新的,但是react 并沒(méi)有提供關(guān)于這個(gè)問(wèn)題的解決方案。那我們能否使用自己的方法來(lái)解決這個(gè)問(wèn)題呢?答案肯定是可以的。

狀態(tài)異步更新帶來(lái)的問(wèn)題

就拿一個(gè)比較常見(jiàn)的場(chǎng)景來(lái)說(shuō)。在react項(xiàng)目中,我們想在關(guān)閉對(duì)話框后再去處理其他業(yè)務(wù)。但是 useState 的狀態(tài)是異步更新的。我們通過(guò)setVisible 更新?tīng)顟B(tài)后,狀態(tài)并沒(méi)有立馬更新,這也就說(shuō)明對(duì)話框并沒(méi)有關(guān)閉,這也就造成了我們后面的邏輯在對(duì)話框沒(méi)關(guān)閉時(shí)就執(zhí)行了,這并不是我們想要的結(jié)果。下面來(lái)看我是如何來(lái)巧妙的解決這個(gè)問(wèn)題的。

問(wèn)題示例

// App.tsx
import {useState} from "react"

export default ()=>{

const [num,setNum]=useState(0)

const add=()=>{
  console.log("更新前",num)
  setNum(num+1)
  console.log('更新后',num)
}

return(
<div className='App'>
 <p>{num}</p>
 <button onClick={add}>num++</button>
</div>
)
}

下面是上面組件運(yùn)行結(jié)果:

點(diǎn)擊按鈕后的運(yùn)行結(jié)果:

當(dāng)我們點(diǎn)擊按鈕時(shí)的打印結(jié)果:

問(wèn)題解決

類(lèi)組件的解決方案

在類(lèi)組件中,我們可以在 setState(newstate,callback) 第二個(gè)參數(shù)傳一個(gè)回調(diào)來(lái)處理本次狀態(tài)更新后的一些其他業(yè)務(wù)。但是在函數(shù)組件中我們?nèi)绾蝸?lái)解決這個(gè)問(wèn)題呢?來(lái)看以下方案,也是我們這篇文章主要想為大家解決的問(wèn)題。

函數(shù)組件的解決方案

解決該問(wèn)題使用到的 api有:useEffectPromise

1.在項(xiàng)目源碼目錄下創(chuàng)建文件夾 customHooks,然后在 customHooks/useCallbackState.ts中編寫(xiě)如下代碼:

import { useState, useRef, useEffect } from 'react';

export default(initState: any)=>{
    const stateRef = useRef(null as any);
    const [state, setState] = useState(initState);

    useEffect(() => {
    stateRef.current && stateRef.current(state);
    }, [state]);

    return [
        state,
        (newState:typeof initState):Promise<typeof initState>=>
        new Promise(rel=>{stateRef.current=rel;setState(newState)}) 
    ];
}

2.在上面的 App.tsx中使用上面的自定義hook

import useCallbackState from "@/customHooks/useCallbackState"
const [num,setNum]=useCallbackState(0)

const add=()=>{
   console.log('更新前',num)
   setNum(num+1)
   .then((newNum:any)=>{
   console.log('更新后',newNum)
   // console.log(num)
  })
}

此時(shí)的運(yùn)行結(jié)果如下:

注意:謹(jǐn)慎使用,打印可以看出,其實(shí)狀態(tài)并沒(méi)有真正完成更新。依然達(dá)不到類(lèi)組件callback的效果。

其他解決方案

如果真的存在上面這種需求,我們可以使用類(lèi)組件,或者使用 setTimeout來(lái)解決上面的問(wèn)題,把對(duì)話框關(guān)閉后的業(yè)務(wù)寫(xiě)在延時(shí)的回調(diào)中就行了,延時(shí)個(gè) 500 毫秒 狀態(tài)一定更新完畢了,個(gè)人感覺(jué)這個(gè)方法不太好,還是推薦使用類(lèi)組件來(lái)解決上述問(wèn)題。

結(jié)尾

到此這篇關(guān)于解決react中useState狀態(tài)異步更新的問(wèn)題的文章就介紹到這了,更多相關(guān)react useState狀態(tài)異步更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redux中異步action與同步action的使用

    Redux中異步action與同步action的使用

    本文主要介紹了Redux中異步action與同步action的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • React中常用的Hook有哪些

    React中常用的Hook有哪些

    這篇文章主要介紹了react hooks實(shí)現(xiàn)原理,文中給大家介紹了useState dispatch 函數(shù)如何與其使用的 Function Component 進(jìn)行綁定,節(jié)后實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 詳解如何構(gòu)建自己的react hooks

    詳解如何構(gòu)建自己的react hooks

    我們組的前端妹子在組內(nèi)分享時(shí)談到了 react 的鉤子,趁此機(jī)會(huì)我也對(duì)我所理解的內(nèi)容進(jìn)行下總結(jié),方便更多的同學(xué)了解。在 React 的 v16.8.0 版本里添加了 hooks 的這種新的 API,我們非常有必要了解下他的使用方法,并能夠結(jié)合我們的業(yè)務(wù)編寫(xiě)幾個(gè)自定義的 hooks。
    2021-05-05
  • 在create-react-app中使用css modules的示例代碼

    在create-react-app中使用css modules的示例代碼

    這篇文章主要介紹了在create-react-app中使用css modules的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • React學(xué)習(xí)之JSX與react事件實(shí)例分析

    React學(xué)習(xí)之JSX與react事件實(shí)例分析

    這篇文章主要介紹了React學(xué)習(xí)之JSX與react事件,結(jié)合實(shí)例形式分析了React中JSX表達(dá)式、屬性、嵌套與react事件相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01
  • 在react中使用 indexDb的方法

    在react中使用 indexDb的方法

    在React中使用IndexedDB進(jìn)行前端離線存儲(chǔ),可以存儲(chǔ)大量數(shù)據(jù),支持復(fù)雜的數(shù)據(jù)類(lèi)型和高性能查詢,通過(guò)示例展示了如何創(chuàng)建數(shù)據(jù)庫(kù)、添加數(shù)據(jù)、查詢數(shù)據(jù)和構(gòu)建一個(gè)簡(jiǎn)單的待辦事項(xiàng)應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 詳解如何使用React構(gòu)建跑馬燈組件

    詳解如何使用React構(gòu)建跑馬燈組件

    當(dāng)你想到跑馬燈時(shí),往往會(huì)想到游樂(lè)園里那些充滿活力的燈光和旋轉(zhuǎn)的顯示,帶回童年的美好回憶,本文將和大家一起探索如何在 React 中構(gòu)建一個(gè)引人入勝的跑馬燈組件,需要的朋友可以參考下
    2024-04-04
  • React的生命周期詳解

    React的生命周期詳解

    React是用于構(gòu)建用戶界面的JavaScript庫(kù)。本文詳細(xì)講解了React的生命周期,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • React.js前端導(dǎo)出Excel的方式

    React.js前端導(dǎo)出Excel的方式

    這篇文章主要為大家介紹了React.js前端導(dǎo)出Excel的方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • react-native使用leanclound消息推送的方法

    react-native使用leanclound消息推送的方法

    這篇文章主要介紹了react-native使用leanclound消息推送的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論

绍兴县| 平遥县| 永康市| 阿图什市| 金湖县| 赤壁市| 昆明市| 太湖县| 平邑县| 安溪县| 崇阳县| 东源县| 应用必备| 石楼县| 天台县| 迁西县| 同江市| 承德市| 泾川县| 江达县| 香格里拉县| 涡阳县| 大连市| 顺义区| 崇义县| 正宁县| 五寨县| 内乡县| 花莲县| 庆元县| 沙河市| 宝应县| 田林县| 密山市| 紫金县| 长阳| 太仓市| 襄樊市| 浮山县| 高淳县| 定陶县|