我使用react-native和redux来实现android应用程序。我的容器组件经常更新,但是我传递给子无状态组件的道具不会更改,但它仍然会一直重新渲染。我如何防止重新渲染?我知道我可以使用shouldComponentUpdate
,但是我需要检查所有属性。为什么无状态组件在道具不变时重新渲染?
回答
这正是React不会为你做这件事的原因。它需要检查所有属性及其子女(和后代)。这可能是很多工作。
如果您使用React-Redux,只需将connect
组件应用于所需的任何数据,并且它不应该重新渲染,因为Redux对您的数据做出了不同的假设。特别是,它假设你在任何地方都使用不可变对象,这意味着它不必检查孩子(或后代)。
如果没有React-Redux,您将需要实现shouldComponentUpdate
,但是如果使用不可变数据,则可以实现泛型函数来进行浅层比较并将其用于所有组件。如果您在任何地方都不使用不可变数据,则需要使用深度比较或优化,以逐个组件为基础实施shouldComponentUpdate
以执行特定检查。
这是使用React-Redux的一个重要原因。
这就是React的工作原理。如果父组件重新呈现,则其所有子组件都将重新呈现,然后React将会区分虚拟DOM输出并查看实际UI中实际需要更新的内容。即使传递给子组件的道具没有改变,这个过程也会发生。是的,shouldComponentUpdate
在这里是正确的解决方案,但据我所知,它不能用于功能组件,因为它们没有生命周期方法。
如果您想防止重新渲染,您可能需要将这些功能组件转换为类组件,并且自己实现shouldComponentupdate
,或者如果您使用的是React 15.3,则将它们扩展为React.PureComponent
。
如果道具不会改变,从React.PureCompont扩展的组件不会重新渲染? – Tino
以前,React提供了一个'PureRenderMixin'来配合创建组件的'React.createClass'方法。由于这些已被弃用,他们添加了一个新的'PureComponent'基类,就好像它有一个浅的相等检查'shouldComponentUpdate'。 – markerikson
知道了,thx很多,只是将其留给其他人: '如果您确定某个特定组件在分析后很慢,则可以将其更改为从React.PureComponent继承,React.PureComponent实现了shouldComponentUpdate(),并使用浅色道具和状态比较' – Tino
- 1. 组件状态变化时无法重新渲染
- 2. 道具变化时反应不会重新渲染组件
- 3. React-redux状态和道具已更新,但组件不在重新渲染
- 4. 道具变化时重新渲染功能组件
- 5. 当道具改变时,React是否重新渲染组件
- 6. 当重新渲染时,React道具只在渲染时更新
- 7. React组件不会在状态更改时重新渲染
- 8. reactjs - 改变状态不会重新渲染组件
- 9. Vue列表项不能在状态变化时重新渲染
- 10. 在状态变化时不响应重新渲染
- 11. Redux状态不更新/重新渲染
- 12. 组件在动作分派和状态更新时无法重新渲染
- 13. React组件在状态更改后不重新渲染
- 14. React在道具更新上重新渲染组件
- 15. 为textInput没有得到重新渲染时状态改变
- 16. 查看是不是重新渲染,不知道为什么
- 17. 更新道具是否应该重新渲染整个组件?
- 18. ListView在react-native的状态改变后不会重新渲染?
- 19. React路由器在状态改变后不重新渲染
- 20. 如果子组件的道具不变,React是否仍然重新渲染它?
- 21. 为什么React组件不渲染?
- 22. 尽管使用相同的道具重新渲染组件
- 23. React类组件渲染功能与道具和状态作为参数
- 24. reactjs演示comopnent不重新渲染上REDX状态变化
- 25. 的setState改变状态,但不会重新渲染
- 26. REDUX体内注射进入状态组件,重新渲染
- 27. 如何重新渲染组件每次状态设置
- 28. ReactiveVar无法重新渲染React组件
- 29. 无法让React组件重新渲染
- 30. 无法重新渲染子组件reactjs
是的,我使用的是React-Redux和不可变的对象,并将容器(标签栏视图)组件连接到所有属性,然后我弹出一个无状态的组件,所以我应该再次将它连接到所需的属性?因为我认为只应该连接容器组件。 – Tino
即使'mapStateToProps'和'mapDispatchToProps'返回空对象(为你实现浅'shouldComponentUpdate'),你也可以连接任何东西。本质上,'connect'创建的HOC成为表示组件的容器。或者,您可以编写'shouldComponentUpdate',或者让React对它进行排序(如果它是一个小组件,则无需担心)。 – DDS