ReactHook使用useState更新變量后,如何拿到變量更新后的值
ReactHook使用useState更新變量后,如何拿到變量更新后的值
場(chǎng)景
const [count, setCount] = useState(0);
在setCount() 更新變量的值后,立即調(diào)用某個(gè)函數(shù)query,在函數(shù)中需要讀取到這個(gè)變量的新值;但是此時(shí)直接調(diào)用的話拿到的是舊值;
為什么變量更新后不能立即拿到新值?
因?yàn)閟etCount 函數(shù)用于更新 count值。
它接收一個(gè)新的 count 值并將組件的一次重新渲染加入隊(duì)列中,在組件的重新渲染中,
useState()返回的第一個(gè)值始終是count更新后的新值,所以如果組件還未重新渲染就直接讀取count變量的話,
拿到的就是未更新的舊值;
const UseState = () => { // 函數(shù)組件中沒有this const [count, setCount] = useState(0) const add = () => { let newCount = count console.log('value1', count); // 0 setCount( newCount+= 1) console.log('value2', count); // 0 query() } const query = () => { console.log('query函數(shù)中:', count); // 0 } return ( <div> <p>{count}</p> <button onClick={add} >增加</button> </div> ) }
打印結(jié)果:
解決方法
1)可以將count的新值通過函數(shù)傳參的方式傳入query函數(shù);
// 改寫add和query函數(shù); const add = () => { let newCount = count console.log('value1', count); setCount( newCount+= 1) console.log('value2', count); query(newCount) } const query = (count) => { console.log('query函數(shù)中:', count); }
打印結(jié)果:
2)在useEffect中調(diào)用query函數(shù),因?yàn)樵趗seEffect中,組件dom已經(jīng)更新完畢,可以拿到count的最新值;
(缺點(diǎn):每次count值改變,都會(huì)觸發(fā)useEffect,從而執(zhí)行query函數(shù);)
// 組件每次渲染之后執(zhí)行的操作,執(zhí)行該操作時(shí)dom都已經(jīng)更新完畢 useEffect(()=>{ // 1、可在此處拿到count更新后的值 console.log('value3', count); query() }, [count]) const add = () => { let newCount = count console.log('value1', count); setCount( newCount+= 1) console.log('value2', count); } const query = () => { console.log('query函數(shù)中:', count); }
打印結(jié)果:
3)通過useRef()定義一個(gè)可變的ref變量,通過current屬性保存count可變值,從而在count更新后,通過ref的current屬性拿到更新后的count值;
注意:調(diào)用query函數(shù)時(shí)需要加上setTimeout()進(jìn)行調(diào)用;
// 定義一個(gè)可變的countRef對(duì)象,該對(duì)象的current屬性被初始化為傳入的參數(shù)count; const countRef = useRef(count) // 在countRef.current屬性中保存一個(gè)可變值count的盒子; countRef.current = count const add = () => { let newCount = count console.log('value1', count); setCount( newCount+= 1) console.log('value2', count); setTimeout(() => query(), 0); } const query = () => { console.log('query函數(shù)中:', countRef.current); }
打印結(jié)果:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
React實(shí)現(xiàn)控制減少useContext導(dǎo)致非必要的渲染詳解
這篇文章主要介紹了React如何有效減少使用useContext導(dǎo)致的不必要渲染,使用useContext在改變一個(gè)數(shù)據(jù)時(shí),是通過自己逐級(jí)查找對(duì)比改變的數(shù)據(jù)然后渲染,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11React?hook實(shí)現(xiàn)簡(jiǎn)單的websocket封裝方式
這篇文章主要介紹了React?hook實(shí)現(xiàn)簡(jiǎn)單的websocket封裝方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09詳解React Angular Vue三大前端技術(shù)
當(dāng)前世界中,技術(shù)發(fā)展非常迅速并且變化迅速,開發(fā)者需要更多的開發(fā)工具來解決不同的問題。本文就對(duì)于當(dāng)下主流的前端開發(fā)技術(shù)React、Vue、Angular這三個(gè)框架做個(gè)相對(duì)詳盡的探究,目的是為了解開這些前端技術(shù)的面紗,看看各自的廬山真面目。2021-05-05React項(xiàng)目中decorators裝飾器報(bào)錯(cuò)問題解決方案
這篇文章主要介紹了React項(xiàng)目中decorators裝飾器報(bào)錯(cuò),本文給大家分享問題所在原因及解決方案,通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01D3.js(v3)+react 實(shí)現(xiàn)帶坐標(biāo)與比例尺的散點(diǎn)圖 (V3版本)
散點(diǎn)圖(Scatter Chart),通常是一橫一豎兩個(gè)坐標(biāo)軸,數(shù)據(jù)是一組二維坐標(biāo),分別對(duì)應(yīng)兩個(gè)坐標(biāo)軸,與坐標(biāo)軸對(duì)應(yīng)的地方打上點(diǎn)。由此可以猜到,需要的元素包括circle(圓)和axis(坐標(biāo)軸),接下來通過本文大家分享D3.js(v3)+react 實(shí)現(xiàn)帶坐標(biāo)與比例尺的散點(diǎn)圖 (V3版本) ,一起看看2019-05-05詳解Stack?Navigator中使用自定義的Render?Callback
這篇文章主要為大家介紹了Stack?Navigator中使用自定義的Render?Callback使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10react 實(shí)現(xiàn)圖片正在加載中 加載完成 加載失敗三個(gè)階段的原理解析
這篇文章主要介紹了react 實(shí)現(xiàn)圖片正在加載中 加載完成 加載失敗三個(gè)階段的,通過使用loading的圖片來占位,具體原理解析及實(shí)現(xiàn)代碼跟隨小編一起通過本文學(xué)習(xí)吧2021-05-05