当连续多次以相同的操作更新状态值时,React 内部会对传递来的新值进行比较,如果值相同,则会屏蔽后续的更新行为,从而防止组件频繁渲染的问题。但这也带来了一个使用误区
const App: React.FC = () => {
const [count, setCount] = useState(() => 0);
**const add = () => {
setCount(count + 1);
setCount(count + 1);
};**
return (
<div>
<h1>currentValue: {count}</h1>
<button onClick={add}>count + 1</button>
</div>
);
};
export default App;
这里,我们在 add 函数内两次执行 count + 1 的操作,希望值增加 2,但是下一次更新渲染的结果只会增加 1
因为 state 的更新是异步的,所以进行第二次增加 1 的操作时,count 的值仍然为 0,而不是 1。react 在比较第二次传来的值时,发现两次状态更新的值是完全一致的,因此会默认阻止再次更新
为了解决上述问题,可以使用函数的方式给状态赋新值。当函数执行时才通过函数的形参,拿到当前的状态值,并基于它返回新的状态值,如下
**const add = () => {
setCount((prev) => prev + 1);
setCount((prev) => prev + 1);
};**
传入的形参 prev 会对值进行更新计算,从而拿到更新后的值
当进行 state 状态修改时,如果新值依赖于旧值(基于旧值进行计算,最终得到新值),此时不要直接在外部进行计算,而是通过函数形参的方式拿到旧值,再进行计算,获得 return 的新值