Immutable.js setIn不工作

时间:2017-11-03 14:29:13

标签: javascript redux immutable.js

我有以下列表,我试图从中返回一个新列表,但我一直收到如下所示的错误。有什么想法吗?

export const questions = List([
  {uuid: uuid(), order: 0, text: 'Which country do you live in?', choices: [
    { choice: 'United States', added: true },
    { choice: 'Canada', added: true },
    { choice: 'Australia', added: true }
  ]},
  {uuid: uuid(), order: 1, text: 'Which country were you born in?', choices: [
    { choice: 'Mexico', added: true },
    { choice: 'California', added: true },
    { choice: 'Seoul', added: true }
  ]}
]);


questions.setIn([0, 'text'], 'changed') 

导致此错误:

immutable.js:870 Uncaught Error: invalid keyPath
    at invariant (immutable.js:870)
    at updateInDeepMap (immutable.js:1974)
    at updateInDeepMap (immutable.js:1980)
    at List.Map.updateIn (immutable.js:1278)
    at List.Map.setIn (immutable.js:1256)
    at eval (eval at ./src/reducers/questionsList.js (questionsList.js:17), <anonymous>:1:11)

2 个答案:

答案 0 :(得分:0)

在Immutable 4.0.0-rc9中,这应该实际上做你想要的。在3.x中,setIn仅适用于深度不可变列表,但根据最新文档:

  

普通JavaScript对象或数组可以嵌套在Immutable.js集合中,setIn()也可以更新这些值,通过应用更改创建这些值的新副本来对其进行不可变处理。

请参阅this answer

问题是questions是一个不可变的vanilla JS对象列表。 List#setIn()仅适用于深度不可变的对象。您可能希望设置questions = Immutable.fromJS(...)以获取深层不可变对象。

但是,如果 故意将你的不可变对象放在你的不可变对象中(我真的希望它不是),那么你是什么意思?我想做的是使用Immutable来获取vanilla对象,然后使用常规ol'赋值来改变值:

questions.get(0)['text'] = 'changed'

答案 1 :(得分:-3)

尝试更新immutable.js库