【发布时间】:2021-10-10 18:23:25
【问题描述】:
我正在尝试在集中管理所有子状态的父组件中呈现多个按钮。这意味着父存储例如点击状态,每个按钮的禁用状态在他自己的状态下使用useState 并将其作为道具传递给孩子。此外,onClick 函数也在父组件内部定义并传递给每个子组件。目前我正在这样做:
const [isSelected, setIsSelected] = useState(Array(49).fill(false));
...
const onClick = useCallback((index) => {
const newIsSelected = [...prev];
newIsSelected[i] = !newIsSelected[i];
return newIsSelected;
}, []);
...
(In the render function:)
return isSelected.map((isFieldSelected, key) => {
<React.Fragment key={key}>
<TheChildComponent
isSelected={isFieldSelected}
onClick={onClick}
/>
</React.Fragment/>
})
为了防止子组件重新渲染我正在使用...
- ...
useCallback让 react 看到 onClick 函数始终保持不变 - ...
React.Fragment让 react 再次找到一个组件,否则孩子将没有唯一的 id 或类似的东西
子组件导出为:
export default React.memo(TheChildComponent, compareEquality) 与
const compareEquality = (prev, next) => {
console.log(prev, next);
return prev.isSelected === next.isSelected;
}
不知何故,compareEquality 中的日志行永远不会执行,因此我知道compareEquality 永远不会执行。我也不知道为什么会这样。
我检查了所有博客、以前的 Stackoverflow 问题等,但还没有找到一种方法来防止每次至少有一个组件执行 onClick 函数时重新呈现子组件,并通过这样做更新了 @987654331 @状态。
如果有人能指出我正确的方向或解释我的问题出在哪里,我会非常高兴。
提前致谢!
【问题讨论】:
-
你的意思是
export default React.memo(TheChildComponent, compareEquality)?useMemo不正确。 -
哎呀,是的,它是 React.memo 而不是 useMemo。刚刚在问题中纠正了它。谢谢。
-
您可以尝试将
[]的第二个参数添加到useCallback吗?如果没有 deps 列表,useCallback无效。 (这并不能解释为什么不调用compareEquality,但它会消除对它的需要。)
标签: javascript reactjs react-hooks react-functional-component