我有以下列表,我试图从中返回一个新列表,但我一直收到如下所示的错误。有什么想法吗?
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)
答案 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库