2

我正在使用 React 构建一个大型应用程序,其中共享父组件处理多个子组件的所有状态。其中一些孩子呈现超过 1000 个项目的列表。

我意识到在父级内部切换布尔值setState将重新渲染父级,进而再次渲染其所有子级。

我的问题是,如果子项的列表项都没有更改,那么重新渲染是否会导致子项循环并重新构建庞大的列表——每次父项重新呈现时?

虚拟 DOM 在其中扮演什么角色?孩子是否重新构建列表但 DOM 永远不必更新,因为 diff 看到列表元素没有改变?

编辑:最后,如果是这种情况,该key属性如何影响列表重新渲染?如果我有 1000 个项目都具有唯一键,但 3 个项目的键是null, (意味着它们具有相同的键值)那么整个列表是否会重新呈现?

4

1 回答 1

1

孩子是否重新构建列表但 DOM 永远不必更新,因为 diff 看到列表元素没有改变?

对,就是这样。您可以在此处更详细地阅读此内容:https ://facebook.github.io/react/docs/reconciliation.html

通常这个操作非常快,你几乎看不出来,但是在某些时候差异补丁会变慢。翻转布尔值可能没什么大不了的,但以 60 fps 翻转布尔值可能会导致一些卡顿。

通常,您可以采取一些聪明的措施来防止任何明显的滞后,但实施shouldComponentUpdate始终是一种选择。

https://facebook.github.io/react/docs/react-component.html#shouldcomponentupdate

当您在那里时,请阅读React.PureComponent以防您对此感兴趣。

于 2016-11-13T20:38:25.613 回答