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中使用Axios發(fā)起POST請(qǐng)求提交文件方式
這篇文章主要介紹了React中使用Axios發(fā)起POST請(qǐng)求提交文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
React在Dva項(xiàng)目中創(chuàng)建并引用頁面局部組件的方式
這篇文章主要介紹了React在Dva項(xiàng)目中創(chuàng)建并引用頁面局部組件的方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
詳解React Angular Vue三大前端技術(shù)
當(dāng)前世界中,技術(shù)發(fā)展非常迅速并且變化迅速,開發(fā)者需要更多的開發(fā)工具來解決不同的問題。本文就對(duì)于當(dāng)下主流的前端開發(fā)技術(shù)React、Vue、Angular這三個(gè)框架做個(gè)相對(duì)詳盡的探究,目的是為了解開這些前端技術(shù)的面紗,看看各自的廬山真面目。2021-05-05
React內(nèi)部實(shí)現(xiàn)cache方法示例詳解
這篇文章主要為大家介紹了React內(nèi)部實(shí)現(xiàn)cache方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
ReactNative實(shí)現(xiàn)的橫向滑動(dòng)條效果
本文介紹了ReactNative實(shí)現(xiàn)的橫向滑動(dòng)條效果,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),補(bǔ)充介紹了ReactNative基于寬度變化實(shí)現(xiàn)的動(dòng)畫效果,感興趣的朋友跟隨小編一起看看吧2024-02-02
解決React報(bào)錯(cuò)Invalid hook call
這篇文章主要為大家介紹了React報(bào)錯(cuò)Invalid hook call解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
React Router 5.1.0使用useHistory做頁面跳轉(zhuǎn)導(dǎo)航的實(shí)現(xiàn)
本文主要介紹了React Router 5.1.0使用useHistory做頁面跳轉(zhuǎn)導(dǎo)航的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
一文詳解React如何處理表單的復(fù)雜驗(yàn)證邏輯
這篇文章主要為大家詳細(xì)介紹了React中如何處理表單的復(fù)雜驗(yàn)證邏輯,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03

