我有下面的列表,我试图从列表中返回一个新的列表,但我一直收到下面显示的错误。有什么想法吗?
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)发布于 2017-11-14 11:13:50
在不可变的4.0.0-rc9中,这实际上应该做你想做的事情。在3.x中,setIn只处理深度不可变的列表,但根据最新的文档:
普通JavaScript对象或数组可以嵌套在Immutable.js集合中,setIn()也可以更新这些值,通过创建应用了更改的这些值的新副本来不变地对待它们。
参见this answer。
问题是questions是一个不可变的普通JS对象列表。List#setIn()只适用于深度不可变的对象。您可能希望将questions = Immutable.fromJS(...)设置为获得一个深度不可变的对象。
但是,如果你有意将普通JS对象放在不可变对象中(我真的希望不是这样),那么你想要做的就是使用immutable来获取普通对象,然后使用常规的ol‘赋值来改变值:
questions.get(0)['text'] = 'changed'发布于 2017-11-04 00:10:03
尝试更新immutable.js库
https://stackoverflow.com/questions/47098138
复制相似问题