react setState()更新浏览器中的所有组件

时间:2016-10-03 08:41:13

标签: javascript reactjs material-ui

我正在使用react和material-ui构建一个巨大的表单。表单使用双向绑定并更新状态以进行输入更改。更改任何输入字段导致所有组件更新 e(显然启用了反应开发人员工具TraceReactUpdate)。说到TextField,它使我的页面呈现非常慢。使用this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this)无济于事。

1 个答案:

答案 0 :(得分:0)

找到上述问题可能非常困难,因为它完全取决于您编写的实际代码。我确信反应渲染概念有效(就像它对我自己和其他许多人一样),但是如果没有看到更多代码,就无法确定实际问题。

尽管如此,我还是觉得真正的原因是简单的",这意味着它很可能是由于传递了道具已经确实发生了变化。也许没有价值,但实际上。 IIRC,PurerenderMixin不比较值(除非数据是值类型),它是比较实例。因此,即使数据相同,如果实例已更改,则它将重新呈现。

需要考虑的一些要点:

如果为组件明确创建shouldComponentUpdate()方法,则可以自行控制。 PureRenderMixin进行浅层检查以查看道具是否已更改,但是,如果您将它们全部传递,那么无论它们是否已在render方法中使用过,那么只有其中一个更改将意味着该组件被认为是需要渲染(如,不安装,但在内存中渲染,并与dom协调可能的更改)。使用shouldComponentUpdate可以帮助您根据自己的检查停止渲染。

使用不可变道具也很有帮助。如上所述,React PureRenderMixin仅进行浅层比较。因此,如果您在具有深度的道具(如子属性)中传递数据结构,则不会检查这些数据结构。这意味着你可以最终遇到你现在遇到的相反问题,那就是应该更新但不是的组件。如果你正在使用ie redux并做了正确的事情"并且正在使用即Immutable.js,那么使用PureRenderMixin就足够了。

阅读特定文档可能会有所帮助,也可能没有帮助。 React手册中有一些很好的描述:https://facebook.github.io/react/docs/advanced-performance.html#shouldcomponentupdate-in-action

并且 - 我忘了说,如果您使用redux,那么您可以考虑使用这些优雅而简单的方式处理表单:

希望这会有所帮助。祝你好运。