我在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
如果有可能,请帮助我,否则我对获取相同对象的相同值的理解是错误的。 谢谢您的帮助。
答案 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
在这里,rec2
和rec3
都是源自rec
的不同突变。尽管它们值相等,但它们不是参照相等。 is
方法比较深值相等性并返回true。
在下一个示例中,rec4
从rec
突变,而rec5
使用ref4
仅更新status
上的0
列表项具有新的价值。在这种情况下,Record
确保返回状态相同,因为值匹配并且不会导致新的突变。