首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Immutable.js setIn不工作

Immutable.js setIn不工作
EN

Stack Overflow用户
提问于 2017-11-03 22:29:13
回答 2查看 2.1K关注 0票数 0

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

代码语言:javascript
复制
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') 

导致此错误:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 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‘赋值来改变值:

代码语言:javascript
复制
questions.get(0)['text'] = 'changed'
票数 0
EN

Stack Overflow用户

发布于 2017-11-04 00:10:03

尝试更新immutable.js库

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47098138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档