【发布时间】:2021-12-27 23:04:48
【问题描述】:
我有以下代码 (CodeSandbox):
function App() {
const [blah, setBlah] = useState(true);
console.log('BLAH', blah);
setBlah(true);
return <button onClick={() => setBlah(true)}>Blah</button>;
}
我了解组件顶层的setBlah(true) 导致重新渲染过多。我不明白的是,如果您注释掉顶级 setBlah(true) 并开始捣碎“Blah”按钮,为什么组件不会重新渲染?两者都将blah 的状态一遍又一遍地设置为true,但只有顶级setBlah(true) 会导致重新渲染。
来自React docs on Bailing out of a state update:“请注意,React 在退出之前可能仍需要再次渲染该特定组件。”这里的关键词是“可能”,这对我来说意味着根据文档我的情况是有效的。所以问题可能变成了,在什么情况下调用setState,使用已经设置的相同值,会导致重新渲染?知道这一点会很有用,因为人们可能希望将逻辑放在他们的 setState 方法前面,以检查值是否与当前值相同,以免导致错误的重新渲染。
【问题讨论】:
-
每次调用
setBlah()都会导致重新渲染。使用您原来的 sn-p,您在每次渲染时都调用setBlah(),这会使您无限循环。另一个setBlah()调用是由事件触发而不是在渲染时触发,这就是它不会导致相同循环的原因。 -
是的,我并不是说
onClick的setBlah应该导致相同的循环——它不应该。我是说它不会导致任何重新渲染发生,甚至一次都没有。 -
由于您已经将 blah 的默认值设置为 true -
const [blah, setBlah] = useState(true)- 捣碎按钮实际上并没有改变状态,因为它已经是 true。我认为:) -
完全是这样,但是为什么这与顶级
setBlah(true)不同,并且在值不变时会导致无休止的重新渲染?如果顶级setBlah(true)导致重新渲染,它会无休止地重新渲染,我希望按钮单击会导致一次重新渲染。
标签: reactjs react-hooks rerender