Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
482 views
in Technique[技术] by (71.8m points)

immer.js不可变对象的用途是什么呢?什么情况需要使用呢?

rt,看了很多文章还是不理解有什么具体的优势?

假如要解决浅比较更新的问题,我之前一般都是

setState(prev => {
    // 修改prev内某个key值
    prev.[......].value = 'xxx'
    return {
        ...prev
    } // 数组就是[...prev]
})

immer.js则是:

import produce from 'immer';

const array = [{value: 0}, {value: 1}, {value: 2}];
const arr = produce(array, draft => {
  draft[0].value = 10;
});

console.log(arr === array);
//false

从更新的角度来说都是最终的链接不一样了,生成新的对象,immer.js原理也是解构赋值。。。对于React来说,只要父节点不同就会直接重新渲染子树,这样的话我直接解构不是一样的吗?绝大多数场景的话,例如商品列表,使用解构赋值的话,每次也是返回一个不同的引用类型,但是为什么还需要使用immutable和immer这类呢?

但是dva.js等都引入immer.js或者immutable.js,我觉得既然大家都使用他必定是有他的价值


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

不可变的原理很简单,就是不修改原有对象,而是通过产生新的来代替原来的,作用也非常单一,就是零副作用。听起来有点别扭,举个例子,你在一个循环里面遍历一个数组,遍历过程中还修改了原数组的数据,这就会带来一些副作用,比如死循环之类的。

immer 和 immutable.js 都只是基于此做了一些封装,让“不可变”写起来更爽而已。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share

2.1m questions

2.1m answers

62 comments

56.7k users

...