在 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
这里,rec2
和rec3
都是源自rec
的不同突变。尽管它们值相等,但它们引用相等。 is
方法比较深度值相等和 returns 真。
在下一个示例中,rec4
从 rec
变异而来,而 rec5
使用 ref4
仅更新 status
列表项 [=21] =] 具有新的价值。在这种情况下,Record
确保返回的状态相同,因为值匹配并且不会导致新的突变。
我在 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
这里,rec2
和rec3
都是源自rec
的不同突变。尽管它们值相等,但它们引用相等。 is
方法比较深度值相等和 returns 真。
在下一个示例中,rec4
从 rec
变异而来,而 rec5
使用 ref4
仅更新 status
列表项 [=21] =] 具有新的价值。在这种情况下,Record
确保返回的状态相同,因为值匹配并且不会导致新的突变。