React中为什么要使用immutableJs

在React中为什么要使用immutableJs

一.state的不可变性

当父组件读取子组件数据form,赋值给obj,然后对obj进行一些修改过程中,直接赋值就是浅拷贝,修改obj之后会影响form对象,也就会影响子组件中的form的值,这也就是js中的隐患,在React中向上层组件或者下层组件传递对象,很难保证这个对象是否会被修改,当不希望对form产生影响的时候,需要手动深拷贝比较麻烦且浪费空间,

immutableJs
immutableJs里面的set或者delete更改某个值之后将会返回一个新的对象,部分数据共享。并且深拷贝对象的时候也不需要把对象里面的值全部复制一遍。每次更改都会生成一个新的对象,不会去影响原对象的值。

二.组件的重渲染

React中父组件的re-render往往会导致子组件的重渲染,这样就会产生许多不必要的渲染,可以在子组件中用PureComponent来进行判断,PureComponent就是自动填充了shouldComponent的判断函数,只判断第一层结构的。
例如父组件有这样的数据结构,传递给子组件

data : {
    num: 1,
}

那么在子组件中判断的时候,只会判断直接参数

props.num ===nextProps.num

当数据结构比较复杂的时候

data : {
    nums: {
        num1: 1,
        num2: 2,
    },
}

那么在子组件的判断就如下

props.nums ===nextProps.nums

这时候即使改变了nums.num1,改变了对象里面的值,但是对象本身地址没有发生改变,因此以上判断就不会造成重新渲染,导致数据错误以上就是PureComponent的弊端。这对这个问题我们一般采用如下方式。

①深拷贝

重新拷贝一个nums到一个新的对象(deepCopy),再去改变这个新的对象的num1的值,这时候在setState这个深拷贝之后的对象,两个对象是两个完全不一样的对象因此子组件会重新渲染。

②深比较

在采用深拷贝之后,或者使用redux的reduce之后还会有一个问题,就是当对象内部的值没有发生变化的时候,每次setState重新生成一个对象,子组件也会进行重新渲染,这时候需要在shoulComponent中进行深比较,比较对象中每一个属性,甚至嵌套属性的值有没有发生变化。在选择是不是进行重新渲染。

immutableJs
immutable 内部使用了 Trie 数据结构来存储,只要两个对象的 hashCode 相等,值就是一样的。这样的算法避免了深度遍历比较,性能非常好。Immutable.js提供了简洁高效的判断数据是否变化的方法,只需 ===(比较的是内存地址,值相同但是比较的结果可能不同) 和 is比较就能知道是否需要执行render()

发布了38 篇原创文章 · 获赞 6 · 访问量 8566

猜你喜欢

转载自blog.csdn.net/qq_36400206/article/details/103641519