我应该在任何地方使用React.PureComponent吗?

时间:2017-03-13 03:49:12

标签: javascript reactjs

React说纯渲染可以优化性能。 现在React有PureComponent。 我应该在任何地方使用React.PureComponent吗? 或者什么时候使用React.PureComponent,哪里是使用React.PureComponent最合适的位置?

2 个答案:

答案 0 :(得分:25)

当组件可以重新渲染时,即使它具有相同的道具和状态,也应该使用它。一个例子是当父组件必须重新渲染但子组件props和state没有改变时。子组件可以从PureComponent中受益,因为它实际上不需要重新渲染。你不应该在任何地方使用它。实现浅#include <gtest/gtest.h> class Bar { public: static const size_t kBar = 0; }; TEST(Basic, Basic) { ASSERT_EQ(0, Bar::kBar); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } 的每个组件都没有意义。在许多情况下,它会添加额外的生命周期方法,而不会让您获得任何胜利。

如果您有许多根级别组件更新而子级不需要这样做的情况,它可以大大节省您的渲染时间。话虽如此,您将在根级节点中使用PureComponent获得更多收益(即PureComponent不会在叶级组件中提高整体性能,因为它只保存来自该组件的渲染)。

对于PureComponent的一些警告在反应文档中得到了很好的解释。

  

React.PureComponent的shouldComponentUpdate()只是浅显比较对象。

如果您的道具更改深入嵌套对象,则可能会意外错过渲染更新。 PureComponent只适用于简单的扁平物体/道具或使用类似ImmutableJS的东西来通过简单的比较来检测任何物体的变化。

  

此外,React.PureComponent的shouldComponentUpdate()跳过整个组件子树的prop更新。确保所有儿童组件也“纯粹”。

PureComponent仅在组件的渲染仅依赖于props和state时才起作用。这应该始终是反应的情况,但有一些例子需要在正常的反应生命周期之外重新渲染。为了让PureComponent按预期工作(跳过重新渲染,你真的不需要发生),PureComponent的每个后代都应该是“纯粹的”(仅依赖于props和state)。

答案 1 :(得分:7)

根据此reference(您不应该在任何地方使用它):

  

(我在React工作。)[...]如果我们建议在任何地方使用PureComponent,它可能已经是默认值。相反 - 决定一个组件是否应该被重新渲染的比较会花费一些东西,如果你确实想要重新渲染,那么花费在检查你是否应该重新渲染的所有时间都会被浪费。

     

相反,我们建议您意识到需要在哪里进行比较。它通常只在您的应用中的几个地方。好的候选人是关于长名单的孩子或者应用程序的大部分独立变化的(即,你知道父母应该经常重新投降但孩子不应该这样做的情况)。一些使用得很好的shouldComponentUpdate(或PureComponent)可以使用很长时间。

-

我发现tweet from Dan Abramov说了同样的话(2016年7月30日)。