当在同步和异步函数中调用多个useState hook的set函数时,我遇到了不同的行为。
function Test() {
console.log('app rendering starts.');
const [a, setA] = useState(1);
const [b, setB] = useState(11);
const updateState = () => {
console.log('\tupdating a starts.');
setA(2);
console.log('\tupdating a ends.');
console.log('\tupdating b starts.');
setB(12);
console.log('\tupdating b ends.');
};
console.log('app rendering ends.');
return (
<div className="App">
<div>a is {a}</div>
<div>b is {b}</div>
<button onClick={() => {
console.log('--------------sync click--------------');
updateState();
}}>Update State a & b Sync</button>
<button onClick={() => {
console.log('--------------async click--------------');
setTimeout(updateState, 0)
}}>Update State a & b Async</button>
</div>
);
}
这两个按钮执行相同的代码,但以不同的方式执行。
同步按钮的结果:
app rendering starts.
app rendering ends.
--------------sync click--------------
updating a starts.
updating a ends.
updating b starts.
updating b ends.
app rendering starts.
app rendering ends.
异步按钮结果:
app rendering starts.
app rendering ends.
--------------async click--------------
updating a starts.
app rendering starts.
app rendering ends.
updating a ends.
updating b starts.
app rendering starts.
app rendering ends.
updating b ends.
这是期望的行为吗?
在异步函数中如何实现同步结果?
我在官方文档中没有找到任何提示。
感激不尽,求助!
谢谢!
sync
调用可以一次性运行所有的setState
函数,然后重新渲染。而async
调用则分为两个部分完成。这确实需要解释一下! - Himanshu Singh