我使用react和material-ui构建了一个巨大的表单。表单使用双向绑定并更新输入更改的状态。更改任何输入字段导致所有组件更新 e(通过反应开发人员工具TraceReactUpdate启用)。说到TextField,它使我的页面呈现非常慢的。使用this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this)
没有帮助。react setState()更新浏览器中的所有组件
回答
找到上述问题可能非常困难,因为它完全取决于您编写的实际代码。我相信反应渲染的概念是有效的(就像我自己和其他许多人一样),但没有看到更多的代码,就不可能确定实际的问题。
不过,我有一种感觉,真正的原因是“简单”,这意味着它很可能是由于道具被通过有确实已改变。也许没有价值,但在实例中。 IIRC,PurerenderMixin没有比较值(除非数据是值类型),它是比较实例。所以即使数据是相同的,如果实例发生了变化,它也会重新渲染。
一些关键点考虑:
- 你路过这一点,你需要给每个组件的道具,或者是你通过了所有的道具都看?
- 数据结构是不可变的吗?
- 您确定没有传递迭代中发生变化的数据,例如将javascript []作为道具传递将意味着数据已更改(请参阅https://medium.com/@esamatti/react-js-pure-render-performance-anti-pattern-fb88c101332f#.hx97qk4tx以获取有关这如何影响您的一天的示例)。
如果您明确地为组件创建shouldComponentUpdate()
方法,那么您可以自己控制它。 PureRenderMixin做了一个简单的检查,看看道具是否已经改变了,但是,如果你将它们都传递了,那么无论它们是否已经在渲染方法中使用过,那么只有其中一个改变将意味着组件被认为是需要渲染(如在,不安装,但在内存中渲染,并与dom协调可能的变化)。使用shouldComponentUpdate可以帮助停止根据您自己的检查进行渲染。
使用不可变的道具也可能有所帮助。如前所述,React PureRenderMixin只进行浅层比较。因此,如果您在具有深度的道具(如子属性)中传递数据结构,则不检查这些数据结构。这意味着你可能结束与你现在有相反的问题,那就是应该更新,但不是。如果你使用的是redux,并且做了“正确的事情”并且正在使用Immutable.js,那么使用PureRenderMixin就足够了。
阅读具体的文档可能会或可能不会帮助。有这样的阵营手册一些很好的说明:https://facebook.github.io/react/docs/advanced-performance.html#shouldcomponentupdate-in-action
而且 - 我忘了说了,如果你使用的终极版,那么你可以考虑处理您的形式,这些几分优雅和简单的方法:
希望这有助于。祝你好运。
非常丰富。我对你的建议。我应该阅读更多关于不可变和纯渲染。我的状态是嵌套的,我从redux商店获取onComponentDidMoubnt的反应状态数据。 redux通过connect()接口获取数据表单上下文。 – ShaD
- 1. jquery更新所有浏览器
- 2. 用React中的setState更新对象
- 3. react-hot-loader配置错误:未更新组件更改时的浏览器
- 4. React js setstate在很多浏览器上不起作用
- 5. 所有浏览器的window.href
- 6. setState后,子组件不会使用新的道具更新
- 7. React - setState()不更新叶级别属性
- 8. 浏览器更新到没有Web服务器的文件
- 9. React ES6中的SetState
- 10. 浏览器更新脚本
- 11. 的setState没有更新对象数组的价值
- 12. React Native - setState与其他组件
- 13. 所有浏览器,但IE浏览器的jquery fadeIn()
- 14. React + Redux:组件不更新
- 15. React redux未更新组件
- 16. SetState似乎并没有更新
- 17. 在所有最新的浏览器中使用style.display =“block”
- 18. Datalist中兼容所有浏览器
- 19. 在所有主流浏览器中清除浏览数据
- 20. 在vi中编写的HTML没有在浏览器中更新
- 21. 嵌入浏览器组件
- 22. 浏览所有文档和批量更新其中一些
- 23. React组件断开浏览器后退/前进按钮
- 24. 浏览器不会反映html文件中所做的更改
- 25. 浏览器不更新代码更改?
- 26. jQuery Script适用于所有浏览器,但Chrome浏览器
- 27. 没有浏览器滚动的Div比浏览器更宽
- 28. 在组件更新Reduce存储中反应本机setState
- 29. WebClient说“更新您的浏览器”
- 30. 网站不会在没有Ctrl + F5的浏览器中更新
您可以通过进行优化来调整渲染效果https://richardscarrott.co.uk/blog/post/rendering-big-lists-in-react/,我已经成功在表单上使用该技术这里https://github.com/richardscarrott/redux-form-v5-vs-redux-form-v6(v5通过将输入拆分为字段集来实现该优化) – riscarrott
另外,请记住使用React的生成版本进行测试。 – riscarrott
@riscarrott谢谢你,我会尝试。现在我对我的表单持怀疑态度,从Redux商店的一部分获取其数据。所以也许我会直接将这部分重新写入Redux,并导致我的表单完全更新。 – ShaD