React 子组件在根状态对象中更改了一个 属性 - 所有子组件是否会渲染?

React sub component changes one property in a root state object - will all sub components render or not?

请注意,我稍微更改了对问题的描述。 state 是一个有很多属性的对象,而不是一个数组。即使它是一个数组,这个问题仍然存在并且是相似的...

我正在开发一个反应网络应用程序。根组件有一个名为 user 的状态变量。 user 有很多属性,每个子组件只使用其中的一个子集。我正在考虑使用反应上下文 API 加上 Memo 让所有子组件都可以访问 user。我读过使用 Memo 只会导致更改的子组件呈现,而不是所有子组件。但是我不确定我是否正确地实现了所有这些,也许所有的子组件都会呈现?

将发生的一种情况是,其中一个子组件更改了 user 中的一个属性,并在根组件中调用了 set_user(newUserWithOnePropertyUpdated)。那么是所有子组件渲染还是只渲染需要的子组件?

我认为在您的情况下,子组件 重新呈现,即使在使用 React.memo() 时也是如此。

重新渲染

如果传递的 属性 与前一个渲染中的组件引用不相等,则组件重新渲染。

因此,如果您将 user-object 传递给子组件 props,并且 user-object 与之前的对象不同,则所有子组件都会重新-渲染,即使你使用 React.memo().

在 React 中,您通常会通过替换整个对象来更新状态,因此 user-object 将始终是一个新对象,并且所有使用 user-object 的子组件都将重新渲染(即使使用 React.memo())。

避免使用React.memo重新渲染,您可以:

  • 只将原始值传递给道具(例如字符串或数字)。
  • 将您的 users-object 拆分为更小的对象,只有在子组件也应该更改时才会更改,并将这些较小的对象传递给子组件道具(user-object可能仍保留对这些较小对象的引用)。
  • 使用 React.memo( component, isEqual ) 的第二个参数,手动定义应被视为“更改”的内容。

优化与否

但是,在不知道您的确切用例的情况下,可能没有必要使用 React.memo() 进行优化,因为 React 在“重新渲染”方面非常高效: 它可能会重新渲染组件结构(速度很快),但不会重新渲染可见的 DOM 树(速度很慢)。

React.memo() 通常仅在必须重新渲染非常多的组件或非常频繁(每次渲染)时才变得重要。