ReactJS:PureRenderMixin插件脚注 - 矛盾?

时间:2015-01-28 12:50:21

标签: javascript reactjs

来自此处的文档:http://facebook.github.io/react/docs/pure-render-mixin.html

脚注表示如果更改了复杂数据(深层数据结构)的结构,则应使用forceUpdate()

从纯粹的定义:it renders the same result given the same props and state

我越来越想到这是一个矛盾,因为如果数据结构发生变化,就意味着你要给出新的道具/状态。因此,该组件不再是“纯粹的”。

在我看来,如果您更改传递给组件的道具或状态,您可以:

use forceUpdate().
remove PureRenderMixin from the mixins.

因此,在引擎盖下......你正在将纯粹的组件转换为“非纯”组件。因此,删除PureRenderMixin应该是唯一可用的选项。

我是对的吗?或者Pure组件意味着组件被“缓存”并在提供相同的道具时重复使用?

抱歉,我在这里有点困惑。

2 个答案:

答案 0 :(得分:3)

PureRenderMixin用于让React了解它不应该不必要地调用您的render方法。例如,如果您的render方法足够复杂,如果您的组件没有使用相同的道具/状态重新渲染,则可以提高性能。

但是,就像它在文档中所说的那样,PureRenderMixin没有比较深层嵌套的数据结构,所以它可能不会调用你的render函数,因为它有一些嵌套结构实际上已经改变了。

在这些情况下,最好不要使用PureRenderMixin并使用shouldComponentUpdate并执行自己的比较逻辑。

另外,从文档中,您should avoid using forceUpdate

答案 1 :(得分:0)

没有副作用是mixin的一个重要方面,因为它可以实现在给定相同状态的情况下不会将组件渲染两次的逻辑。

这不应该是一个令人满意的答案,因为正如您所指出的,嵌套更改不会被浅层检查捕获......除非您的数据结构是不可变的!

我强烈建议在不可变数据结构上观看Lee Byron's talk,这解释了不可变数据如何通过避免一系列问题来提高应用程序的性能。

基本上,像immutable.js这样的智能库将在不可变对象的两个快照之间共享公共状态。 因此,浅层相等性证明了基础数据没有被改变。