immer.js初试

468 阅读1分钟

简介

Immer 是 mobx 的作者写的一个 immutable 库,核心实现是利用 ES6 的 proxy,几乎以最小的成本实现了 js 的不可变数据结构,简单易用、体量小巧、设计巧妙,满足了我们对JS不可变数据结构的需求。

解决的问题

假设有这样一个对象

let myData = {
  b: {
    c: [2],
  },
}

当我们执行下面的操作时:

let a1 = myData;
o1.p = 1;        // myData 被修改了
o1.p.x = 1;      // myData 被修改了

即使使用了展开运算符:

let a3 = {
  ...myData
};
a3.p.x = 1;      // myData 被修改了

使用immer

import produce from 'immer';
let a4 = produce(myData, draft => {
  draft.p.x = 1;
})

为什么不用深浅拷贝

深度拷贝,但是深拷贝的成本较高,会影响性能;