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);
}打印结果:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
React实现控制减少useContext导致非必要的渲染详解
这篇文章主要介绍了React如何有效减少使用useContext导致的不必要渲染,使用useContext在改变一个数据时,是通过自己逐级查找对比改变的数据然后渲染,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-11-11
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
散点图(Scatter Chart),通常是一横一竖两个坐标轴,数据是一组二维坐标,分别对应两个坐标轴,与坐标轴对应的地方打上点。由此可以猜到,需要的元素包括circle(圆)和axis(坐标轴),接下来通过本文大家分享D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本) ,一起看看2019-05-05
详解Stack Navigator中使用自定义的Render Callback
这篇文章主要为大家介绍了Stack Navigator中使用自定义的Render Callback使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-10-10
react 实现图片正在加载中 加载完成 加载失败三个阶段的原理解析
这篇文章主要介绍了react 实现图片正在加载中 加载完成 加载失败三个阶段的,通过使用loading的图片来占位,具体原理解析及实现代码跟随小编一起通过本文学习吧2021-05-05


最新评论