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

Setting same value using set function in Record is creating a new object

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

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

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

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

在上面的代码片段中,状态是从操作中接收到的,它类似于状态中的现有状态值。

下面是显示我面临的问题的代码笔:

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

如果可能的话请帮助我,或者我对获得相同值的相同对象的理解是错误的。 预先感谢您的帮助。

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

这是代码(修改了你的codepen)-

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 方法比较深度值相等和 returns 真。

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