javascript - Immutable.js 允许对象发生变化

标签 javascript immutable.js

这是一个 Redux reducer 示例:

case REDUCE_ME:
  const newState = state.setIn(['a', 'b', 'c'], payload);
  payload.id = 'I MANIPULATE STORE!'; 
  return newState; // newState.a.b.c.id is 'I MANIPULATE STORE!'

预期行为:id 不应更改。

感谢各位的帮助。

最佳答案

重点是因为您的有效负载不是不可变的对象。同样的事情,上下文较少:

const a = {'foo': 'bar};

您无法为 a = 'baz'; 重新赋值,因为 a 是一个常量。但是您可以更改 a.foo 的值,因为它不是常量/不可变的。您可以使用 a.foo = 'baz'; 它会起作用。所以你正在用 immutableJs 做同样的事情。如果您想拥有完全不可变的结构,请将您的有效负载也转换为不可变的。并且您已经更新了值,因为 immutablejs 保存了指向源变量的指针,而无需创建该值的新本地实例。

简而言之 - 在使用有效负载之前使用payload = Immutable.fromJS(payload),这样您就可以将所有结构视为不可变。

const state1 = new Immutable.fromJS({
   a: {
       b: {
           c: 'foo'
       }
   }
});

console.log('State 1', state1.toJS());

let payload = 'bar';
const state2 = state1.setIn(['a','b','c'], payload);
console.log('state2 after 1st change',state2.toJS());

payload = 'baz';

console.log('state2 adter 2nd change',state2.toJS()); // c will be still bar

let payload2 = {'a': 'bar'};
// attaching payload2 which can not be changed from object to something else but it's inside values can be changed.
// same like with const a = {'foo': 'bar}; you cant re-assign value to a, but you can modify a.foo = 'whatever else';
const state3 = state1.setIn(['a','b','c'], payload2);  
console.log('state3 after 1st change',state3.toJS());

payload2.a = 'baz';
console.log('state3 after 2nd change (switched to baz)',state3.toJS());

payload2 = 'baz';
console.log('state3 after 3rd change (tried to set payload2 to string)',state3.toJS());

https://codepen.io/anon/pen/bYNWNr

关于javascript - Immutable.js 允许对象发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47012327/

相关文章:

java - 单选按钮选择及其在spring mvc中的值

javascript - vuejs2 onclick不会调用定义的方法函数

javascript - 如何使用具有两个不同 Controller 和不同模块的服务在不同模块之间传递数据?

react-native - Redux reducer 没有更新 immutable.js Redux 存储

javascript - Immutable.Js - 在 map 中添加新属性

javascript - 当 div 存在或加载时更改内容

javascript - Immutable.js:通过索引获取 map 实体(不是按键)

javascript - 传单 map 的绘制线

javascript - Immutable.js 将值映射到数组

javascript - 需要找到这个脚本