ReactHook使用useState更新变量后,如何拿到变量更新后的值
作者:wen_文文
这篇文章主要介绍了ReactHook使用useState更新变量后,如何拿到变量更新后的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
ReactHook使用useState更新变量后,如何拿到变量更新后的值
场景
const [count, setCount] = useState(0);
在setCount() 更新变量的值后,立即调用某个函数query,在函数中需要读取到这个变量的新值;但是此时直接调用的话拿到的是旧值;
为什么变量更新后不能立即拿到新值?
因为setCount 函数用于更新 count值。
它接收一个新的 count 值并将组件的一次重新渲染加入队列中,在组件的重新渲染中,
useState()返回的第一个值始终是count更新后的新值,所以如果组件还未重新渲染就直接读取count变量的话,
拿到的就是未更新的旧值;
const UseState = () => { // 函数组件中没有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函数中:', count); // 0 } return ( <div> <p>{count}</p> <button onClick={add} >增加</button> </div> ) }
打印结果:
解决方法
1)可以将count的新值通过函数传参的方式传入query函数;
// 改写add和query函数; const add = () => { let newCount = count console.log('value1', count); setCount( newCount+= 1) console.log('value2', count); query(newCount) } const query = (count) => { console.log('query函数中:', count); }
打印结果:
2)在useEffect中调用query函数,因为在useEffect中,组件dom已经更新完毕,可以拿到count的最新值;
(缺点:每次count值改变,都会触发useEffect,从而执行query函数;)
// 组件每次渲染之后执行的操作,执行该操作时dom都已经更新完毕 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函数中:', count); }
打印结果:
3)通过useRef()定义一个可变的ref变量,通过current属性保存count可变值,从而在count更新后,通过ref的current属性拿到更新后的count值;
注意:调用query函数时需要加上setTimeout()进行调用;
// 定义一个可变的countRef对象,该对象的current属性被初始化为传入的参数count; const countRef = useRef(count) // 在countRef.current属性中保存一个可变值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函数中:', countRef.current); }
打印结果:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。