2016-10-03 73 views
1

我使用react和material-ui构建了一个巨大的表单。表单使用双向绑定并更新输入更改的状态。更改任何输入字段导致所有组件更新 e(通过反应开发人员工具TraceReactUpdate启用)。说到TextField,它使我的页面呈现非常慢的。使用this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this)没有帮助。react setState()更新浏览器中的所有组件

+0

您可以通过进行优化来调整渲染效果https://richardscarrott.co.uk/blog/post/rendering-big-lists-in-react/,我已经成功在表单上使用该技术这里https://github.com/richardscarrott/redux-form-v5-vs-redux-form-v6(v5通过将输入拆分为字段集来实现该优化) – riscarrott

+0

另外,请记住使用React的生成版本进行测试。 – riscarrott

+0

@riscarrott谢谢你,我会尝试。现在我对我的表单持怀疑态度,从Redux商店的一部分获取其数据。所以也许我会直接将这部分重新写入Redux,并导致我的表单完全更新。 – ShaD

回答

0

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

不过,我有一种感觉,真正的原因是“简单”,这意味着它很可能是由于道具被通过确实已改变。也许没有价值,但在实例中。 IIRC,PurerenderMixin没有比较值(除非数据是值类型),它是比较实例。所以即使数据是相同的,如果实例发生了变化,它也会重新渲染。

一些关键点考虑:

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

使用不可变的道具也可能有所帮助。如前所述,React PureRenderMixin只进行浅层比较。因此,如果您在具有深度的道具(如子属性)中传递数据结构,则不检查这些数据结构。这意味着你可能结束与你现在有相反的问题,那就是应该更新,但不是。如果你使用的是redux,并且做了“正确的事情”并且正在使用Immutable.js,那么使用PureRenderMixin就足够了。

阅读具体的文档可能会或可能不会帮助。有这样的阵营手册一些很好的说明:https://facebook.github.io/react/docs/advanced-performance.html#shouldcomponentupdate-in-action

而且 - 我忘了说了,如果你使用的终极版,那么你可以考虑处理您的形式,这些几分优雅和简单的方法:

希望这有助于。祝你好运。

+1

非常丰富。我对你的建议。我应该阅读更多关于不可变和纯渲染。我的状态是嵌套的,我从redux商店获取onComponentDidMoubnt的反应状态数据。 redux通过connect()接口获取数据表单上下文。 – ShaD