我试图将问题归结为一个尽可能简单的例子:
我们有一个子组件列表,每个子组件称为NumChoice
,每个代表一个数字。NumChoice
被包裹在React.memo
. 在父组件中,我们有一个布尔数组choices
,每个对应一个子组件NumChoice
。起初, 的所有元素choices
都是false
。为了渲染子组件,我们遍历choices
,并为每个选择生成相应的子组件NumChoice
。chooseDivisibles
我们在父组件中定义一个函数,使用useCallback
从每个子组件调用的函数NumChoice
。chooseDivisibles
获取调用者的索引NumChoice
并将相应的元素更改为choices
to true
。如果NumChoice
其对应的元素在choices
是true
,否则,其背景颜色为“白色”。
完整代码位于: https ://codesandbox.io/s/react-rerender-l4e3c?fontsize=14&hidenavigation=1&theme=dark
包裹NumChoice
inReact.memo
和chooseDivisibles
in useCallback
,我们希望只重新渲染NumChoice
相应元素发生choices
变化的组件,但 React 会重新渲染它们。chooseDivisibles
被包裹在 中,除了 .useCallback
之外没有列出任何依赖项setChoices
。此外,NumChoice
被包裹起来React.memo
,它应该只在指定的道具发生变化时重新渲染,但它们没有变化,并且变化choices
不应该对重新渲染有任何影响NumChoice
。如果我们排除检查上一个和下一个道具的相等性chooseDivisibles
,它会按预期工作,但我认为上一个和下一个的比较chooseDivisibles
不应该影响重新渲染NumChoice
,因为它被包裹在useCallback
并且不依赖于choices
. 我们如何防止重新渲染NumChoice
props
未更改的组件?