使用Record中的set函数设置相同的值将创建一个新对象

时间:2018-06-29 08:51:49

标签: reactjs immutable.js

我在ReduceStore中使用不可变记录,以避免在没有数据更改的情况下放弃更改。即使对于相同的数据,创建新对象的Immutable.js和ReduceStore areEqual函数也会返回false并发出更改。 我正在使用以下结构

const Rec = Immutable.Record({
   status: Immutable.List()
});

并在状态中设置相同的元素

const rec2 = rec.set('status', Immutable.List(status));

在上面的代码段中,staus是从动作中获得的,类似于状态中的现有状态值。

下面是显示我所面临问题的Codepen:

https://codepen.io/anon/pen/vrvKaw?editors=1111

如果有可能,请帮助我,否则我对获取相同对象的相同值的理解是错误的。 谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要使用is方法执行相等性检查,因为代码正在创建同一对象的两个不同的变异。

这是代码(已修改您的代码笔)-

var b= ['one'];

const Rec = Immutable.Record({
   status: Immutable.List()
});
const rec = new Rec();
// value equality
const rec2 = rec.set('status', Immutable.fromJS(b));
const rec3 = rec.set('status', Immutable.fromJS(b));
console.log(Immutable.is(rec2, rec3)); // true
// or
console.log(rec2.is(rec3)); // true

// reference equality
const rec4 = rec.set('status', Immutable.fromJS(b));
const rec5 = rec4.setIn(['status', 0], 'one');
console.log(rec4 === rec5); //true

在这里,rec2rec3都是源自rec的不同突变。尽管它们值相等,但它们不是参照相等is方法比较深值相等性并返回true。

在下一个示例中,rec4rec突变,而rec5使用ref4仅更新status上的0列表项具有新的价值。在这种情况下,Record确保返回状态相同,因为值匹配并且不会导致新的突变。