我正在使用React构建一个大型应用程序,其中共享父组件处理多个子级的所有状态。其中一些孩子会呈现超过1000个项目的列表。
我意识到用setState
在父级内部切换布尔值将重新渲染父级,然后再次渲染其所有子级。
我的问题是,如果孩子的列表项没有变化,那么重新渲染是否导致孩子循环并重新构建庞大的列表 - 每次父母重新渲染?
虚拟DOM在哪里发挥作用?孩子是否重新构建列表但是DOM永远不必更新,因为diff看到列表元素没有改变?
编辑:
最后,如果是这种情况,key
属性如何影响列表重新呈现?如果我有1000个项目都有唯一键,但3个项目的键为null
,(意味着它们具有相同的键值)然后整个列表是否会重新渲染?
答案 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
,以防您感兴趣。