背景:
React代码如下
import { useState } from 'react';
export default function App() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
setTimeout(() => {
console.log(count, 'end'); // 还是 0!
}, 5000);
}
return (
<>
<button onClick={handleClick}>+1</button>
<span>{count}</span>
</>
);
}
setCount的更新是异步更新的,setTimeout也是异步的,为什么点击,console.log打印的是0,而不是1。
尝试:
尝试用普通js函数进行比较,js代码如下
function outerFunction() {
let count = 0;
function innerFunction() {
console.log(count);
}
count = 1; // 将count更新为1
setTimeout(innerFunction, 5000);
count = 2;
}
outerFunction();
console.log打印的是最新的值2。
疑问: 两段代码的打印结果不同,是什么原因呢?
你可以把
react
组件的每次渲染理解为生成了一个平行宇宙。初始化渲染时生成的平宇宙,其
count
值为0
,所以就算定时器延迟一年执行,它也只能输出0
。当你调用
setCount(count + 1)
,这触发了第二次渲染,又生成了一个平行宇宙,这个平行宇宙中的count
是1
,这个宇宙中的定时器也就只能输出1
。去掉定时器帮助理解