ReactJS - 父组件中`setState`的性能含义

时间:2016-11-13 20:19:28

标签: javascript reactjs virtual-dom

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

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

我的问题是,如果孩子的列表项没有变化,那么重新渲染是否导致孩子循环并重新构建庞大的列表 - 每次父母重新渲染?

虚拟DOM在哪里发挥作用?孩子是否重新构建列表但是DOM永远不必更新,因为diff看到列表元素没有改变?

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

1 个答案:

答案 0 :(得分:1)

  

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

是的确切。您可以在此处详细了解这一点:https://facebook.github.io/react/docs/reconciliation.html

通常这种操作速度很快,你很难说,但是在某些时候,差异补丁会变慢。翻转布尔值可能不是什么大问题,但是以60 fps的速度翻转布尔值可能会导致一些混乱。

通常有一些聪明的事情可以防止任何明显的延迟,但实施shouldComponentUpdate始终是一种选择。

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

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