在 React 中,为什么 setTimeout 中的 setState 只能与状态副本一起正常工作?
In React, why does setState in a setTimeout only work properly with a copy of the state?
在我下面的代码中,我将 setCards 放在 setTimeout 中,但 1 秒后渲染只有在我传入状态副本时才会正确:[...cardStates] 而不是 cardStates 本身。如果我不这样做,setCards 将呈现 cardStates,就像 hideCards() 对状态进行更改之前一样。
我认为这与 setTimeout 将函数放入队列时的状态有关,但我不完全了解发生了什么。我查了很多资料,发现陈旧的闭包之类的东西,但我不确定这是否是正确的方向。有人可以帮我解决这个问题吗?谢谢。
useEffect(() => {
if (numberShowing(cardStates) === 2) {
setTimeout(() => {
setCards(hideCards([...cardStates]));
}, 1000)
}
})
function hideCards(cards) {
let showing = cards.filter(card => {
return card.cardState === 'showing';
})
showing.forEach(card => {
card.cardState = 'hiding';
});
return cards;
}
因为状态是不可变的,所以不能直接操作它。尝试调试带有可变数据的东西,在某些情况下它会变得很痛苦。
这不是不变性的唯一好处,但我不会做比您在互联网上已经找到的更好的解释;)。
在我下面的代码中,我将 setCards 放在 setTimeout 中,但 1 秒后渲染只有在我传入状态副本时才会正确:[...cardStates] 而不是 cardStates 本身。如果我不这样做,setCards 将呈现 cardStates,就像 hideCards() 对状态进行更改之前一样。
我认为这与 setTimeout 将函数放入队列时的状态有关,但我不完全了解发生了什么。我查了很多资料,发现陈旧的闭包之类的东西,但我不确定这是否是正确的方向。有人可以帮我解决这个问题吗?谢谢。
useEffect(() => {
if (numberShowing(cardStates) === 2) {
setTimeout(() => {
setCards(hideCards([...cardStates]));
}, 1000)
}
})
function hideCards(cards) {
let showing = cards.filter(card => {
return card.cardState === 'showing';
})
showing.forEach(card => {
card.cardState = 'hiding';
});
return cards;
}
因为状态是不可变的,所以不能直接操作它。尝试调试带有可变数据的东西,在某些情况下它会变得很痛苦。
这不是不变性的唯一好处,但我不会做比您在互联网上已经找到的更好的解释;)。