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

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

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

疑惑

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

狀態(tài)異步更新帶來的問題

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

問題示例

// 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)擊按鈕時的打印結(jié)果:

問題解決

類組件的解決方案

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

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

解決該問題使用到的 api有:useEffect,Promise

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

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)
  })
}

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

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

其他解決方案

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

結(jié)尾

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

相關(guān)文章

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

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

    本文主要介紹了Redux中異步action與同步action的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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)分享時談到了 react 的鉤子,趁此機(jī)會我也對我所理解的內(nèi)容進(jìn)行下總結(jié),方便更多的同學(xué)了解。在 React 的 v16.8.0 版本里添加了 hooks 的這種新的 API,我們非常有必要了解下他的使用方法,并能夠結(jié)合我們的業(yè)務(wù)編寫幾個自定義的 hooks。
    2021-05-05
  • 在create-react-app中使用css modules的示例代碼

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

    這篇文章主要介紹了在create-react-app中使用css modules的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    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)行前端離線存儲,可以存儲大量數(shù)據(jù),支持復(fù)雜的數(shù)據(jù)類型和高性能查詢,通過示例展示了如何創(chuàng)建數(shù)據(jù)庫、添加數(shù)據(jù)、查詢數(shù)據(jù)和構(gòu)建一個簡單的待辦事項(xiàng)應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 詳解如何使用React構(gòu)建跑馬燈組件

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

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

    React的生命周期詳解

    React是用于構(gòu)建用戶界面的JavaScript庫。本文詳細(xì)講解了React的生命周期,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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消息推送的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論

鄯善县| 金溪县| 博罗县| 宁波市| 西峡县| 剑河县| 昆山市| 武平县| 兖州市| 丹巴县| 米脂县| 花莲县| 项城市| 青岛市| 浦城县| 阿拉善右旗| 台北市| 会宁县| 华宁县| 碌曲县| 綦江县| 宜春市| 和田市| 曲阜市| 马公市| 谷城县| 贵定县| 顺义区| 青岛市| 龙里县| 安新县| 保定市| 合江县| 黔西| 铅山县| 克拉玛依市| 化州市| 梁平县| 扶绥县| 香格里拉县| 柏乡县|