React + Immutable - 使用浅等式实现shouldComponentUpdate

时间:2016-09-10 08:15:04

标签: reactjs immutable.js

所以我使用了反应,并且我正在使用facebook的immutable.js库在我的项目中使用不可变数据。

我知道React比其他所有库都快,因为它只更新了neccesarry DOM,我知道它在更新之前会进行协调过程,并且在创建虚拟DOM的过程中会比较它们,但我从来都不知道它如何知道要更新的内容。 所以我做了一些研究,而且它是真的,反应的协调算法真的很棒并且节省了时间,但是接下来的东西击中了我,shouldComponentUpdate方法在哪里进入? 因此,react会为每个组件调用shouldComponentUpdate,如果它返回true,则react会执行协调过程,包括创建虚拟dom并进行比较。 那么为什么我们不应该为每个组件实现SCU方法呢? Well react还给出了一个答案,包括比较可变对象,以及在这种情况下的相等应该是一个深度,这将花费太长时间,所以你可能不会实现它。

以下是我提出问题的部分,如果我的项目中的所有数据实际上都是不可变的,为什么我不应该在所有组件上使用简单的浅层实现SCU?这样我们就可以节省协调过程,我们的应用程序会更快。

1 个答案:

答案 0 :(得分:1)

据我所知,如果你有SCU方法并且它返回true,React会创建虚拟DOM并将其与现有DOM进行比较。如果它们是相同的,那么,没有任何事情发生,但仍然是创建虚拟DOM的成本。另一方面,如果SCU方法返回false,它会跳过组件和子组件并保持相同(不创建虚拟DOM)。

如果所有道具都在values键下收集为Immutable并且组件中没有状态,则实现SCU组件(如下面的示例代码)是最有效的方法,

shouldComponentUpdate(nextProps) {
  return !Immutable.is(this.props.values, nextProps.values)
}