Immutable相关知识
1. JS 与 Immutable 的对应关系
JS.Array => Immutable.List
JS.Map => Immutable.Map
JS.Set => Immutable.Set
2. 比较 immutable 值
应该使用 is 或 equals 来比较 immutable 的值
import { is, Map } from 'immutable'
const a = Map({ a: 1, b: 2 })
const b = Map({ a: 1, b: 2 })
console.log(a.equals(b)) // true
console.log(is(a, b)) // true
console.log(a === b) // false如果一个操作,返回了一个没有变化的对象,那么可以使用 === 来进行比较:
import { Map } from 'immutable'
const a = Map({ a: 1, b: 2 })
const b = a.set('b', 2) // 实际上并没有改变 a
console.log(a === b) // true
console.log(a.equals(b)) // true
console.log(is(a, b)) // true3. Immutable List 具有和 JS Array 一样的 API
4. 原生的 JS 对象或数组作为 Immutable 的函数参数
在任何能接受 Collection 的地方,都能传入原生的 JS 对象或数组作为参数
5. 原生 JS 对象与 Immutable 对象互相转换
fromJS: 将原生 JS 对象和数组转成 Immutable:
将 immutable 转换为原生 JS 对象分为浅转换和深转换:
浅转换: toArray(), toObject(), 即只转换一层
深转换: toJS()
6. 嵌套结构的读取和操作
7. 自返回的优化和 withMutations 优化
自返回的优化:
可以使用 withMutations 来合并一些变化, 因为【没有临时的中间对象生成】,因此能够优化性能
8. 性能优化举例
在平常写组件的时候,我们可能会有以上的代码,尽管实际上 store 的值没有发生变化,但是还是每次都是打印 render child
React.memo 没有生效,当然这种场景下我们可以通过自定义 React.memo 的比较函数,来保证这种情况下不渲染。
但是当 props 数据结构比较复杂时,自定义函数也会很麻烦
而使用 immutable 就没有这个问题:
通过定义 immutable 类型的数据作为 state 的值,React.memo 就会认为两次的 props 相等,从而避免无谓的渲染,
9. List
9.1 构造函数
List 是函数而不是类,因此不需要使用 new 关键字
List 接受实现了 Iterable 接口的值(如数组,Set 等)作为参数,返回 List 结构。
9.2 静态方法
9.3 size
9.4 改变数据的方法
9.5 深度改变数据的方法
10. Map
和 JS 中的 Map 类似,可以把 对象 作为 key。
10.1 构造函数
10.2 静态方法
10.3 size
10.4 改变数据的方法
10.5 深度改变数据的方法
11. 别的类库
在日常开发中,我们还可以使用诸如 immutability-helper 这样的简单一些的库。
比如刚刚那个性能优化的例子,如果使用 immutability-helper 那就是这样:
参考资料
Last updated
Was this helpful?