关于useRef的一点疑惑
今天碰到一道面试题目,题目是关于React中useRef的使用,代码如下:
const App = ()=>{
const [count, setCount] = useState(0);
const lastCount = useRef(count);
useEffect(()=>{
lastCount.current = count;
})
function handleAlertClick(){
setTimeout(()=>{
alert(lastCount.current)
},3000);
}
return <div>
<p>你点击了{count}次</p>
<button onClick={()=>setCount(count+1)}>click me</button>
<button onClick={handleAlertClick}> show Alert</button>
</div>
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
问题是:多次点击第一个按钮,中途点击一下第二个按钮,然后再点击第一个按钮,弹窗弹出的数字是什么样的,解释一下流程。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
每次弹出来都是最新的值,流程就是setCount之后触发rerender,然后count变更了,useEffect由于没有指定依赖所以每次rerender都会重新执行,故而每次ref都是最新值,如果useEffect依赖为空数组则每次都是0
useState和useEffect的问题
useState触发更新,useEffect每次渲染后调用
setTimeout和useRef的问题
明白上一点后,我们跳出react简化一下, 其实就是
这个经典(烂大街)的问题,用var或者let会有不同的结果,原因是作用域不同;
那么useRef属于哪一种呢,useRef返回的对象在组件的生命周期保持不变,和
var
是一样的;这里
alert(lastCount.current)
改成alert(count)
,结果就会变成和let
一样,因为useState每次更新都会有一个”副本“