【发布时间】:2021-01-30 20:05:04
【问题描述】:
我的 React 组件中有两种状态:
// Selected item state
const [selectedItem, setSelectedItem] = React.useState(null);
// Toggle callout visibility
const [isCalloutVisible, setIsCalloutVisible] = React.useState(false);
我有一个重置功能来重置我的状态。为了防止双重重新渲染,我绕过了 setIsCalloutVisible:
const reset = () => {
isCalloutVisible = false;
setSelectedItem(null);
}
这是正确的方法吗?或者有没有更简洁的方法在一次重新渲染中重置两种状态?
[edit] 感谢第一个 cmets 和回复,显然将两者合并到一个状态会有所帮助。我有兴趣了解的是为什么我目前的方法不正确,以及负面影响是什么。
【问题讨论】:
-
不是。正确的做法是“找出哪些动作触发了双重渲染,然后找出为什么它会触发双重渲染,然后修复它”。
-
如果这些值绑定在一起,请将它们转换为单一状态,以便您可以同时更新它们。
-
不,你不应该改变你的状态对象,这是一种反模式。 “双重渲染”有问题吗?例如,第二次渲染是否会导致您的应用出现问题?为什么不能在同一个渲染周期内同时重置两者?是什么导致任何东西双重渲染?请提供更多背景信息。
-
React 文档也是(重新)熟悉复杂性的绝佳来源,reactjs.org/docs/hooks-rules.html#explanation 涵盖了一些重要方面
-
啊,假设......每次都会让你明白。不,正如@Mike'Pomax'Kamermans 所描述的那样......来自任何单个渲染周期的所有排队状态更新本质上是“聚合在一起”,几乎就像一个“单个”更新。至少,由于 Javascript 事件循环的工作方式,React 需要等待至少函数完成排队多个更新才能开始任何状态更新.这方面是否清楚一点并且有意义?
标签: reactjs react-hooks use-state