Immutable.js - fromJS 生成 Record 代替 Map

Posted

技术标签:

【中文标题】Immutable.js - fromJS 生成 Record 代替 Map【英文标题】:Immutable.js - fromJS generate Record in place of Map 【发布时间】:2016-11-23 23:16:38 【问题描述】:

我一直在玩 React、Redux 和 Immutable,但遇到了一些我非常不喜欢的东西。我有一个从服务器返回的大型 JSON 数据集,我正在使用 fromJS 帮助器将其解析为 Immutable。

一切都很好,但是在访问我的组件中的属性时,我不得不使用不可变特定的 getter 和 setter。我的问题是绑定到不可变的,比如说我决定改变它,我必须检查每一个组件并相应地调整。

这让我想到了我的问题,目前 fromJS 返回列表和地图,是否可以用记录替换地图?

然后,这会将我的组件与不可变的组件分离并具有本机属性,例如 user.name 而不是 user.get('name')

我读过一些关于复活器的文章,但似乎找不到类似的用例。

我玩过以下方法,但我不确定这是否是最佳解决方案:

var result = Immutable.fromJS(

    id: 2039428947,
    name: 'James',
    email: 'james@email.com',
    country: 'United Kingdom'

, function(key, value) 

    var obj = Immutable.Record(value.toJS());

    return new obj(value);

);

谢谢

【问题讨论】:

你没有使用 Immutable。 alternatives 可能更适合你,或者你可以在 reducer 中从你的状态创建新的原生对象。 【参考方案1】:

更新

我已经把它包装在一个可以为你做这件事的小包里: https://www.npmjs.com/package/immutable-parsejs

原始答案

对于其他对使用 ImmutableJS 感兴趣但又能够在组件中使用本机属性的人,例如 user.name 而不是 user.get('name'),只需使用以下函数而不是 fromJS

function convertJs(js) 

   if(typeof js !== 'object' || js === null) 

       return js;

   

   if(Array.isArray(js)) 

       return Seq(js).map(convertJs).toList();

   

   let obj = Record(js);

   obj = new obj(Seq(js).map(convertJs));

   return obj;


要记住的一点是属性冲突,请确保您提供给函数的对象不包含 ImmutableJs 使用的属性名称,size 是好的例子。如果存在冲突,您将收到以下消息,但没有指出问题出在哪里:

未捕获的错误:无法在不可变记录上设置

【讨论】:

我不明白用户何时以及为何会使用“记录”。你知道任何详细解释这一点的资源吗? 根据文档:facebook.github.io/immutable-js/docs/#/Record Record 充当常规 js 对象,允许您以相同的方式访问属性,例如 user.name 而不是 Map 使用 .get 方法,例如 user.get('name');它们还允许您强制执行一组属性,并且可以作为内置文档,因为它们的内容清楚地显示。相比之下,地图可以具有任意数量的未严格执行的属性。 那个属性名的评论非常好,帮了我!对我来说,属性错误已被使用,所以我不得不重命名它 我没有考虑过属性冲突,+1 用于解决我损坏的嵌套记录。 @FareedAlnamrouti 应大众需求:npmjs.com/package/immutable-parsejs

以上是关于Immutable.js - fromJS 生成 Record 代替 Map的主要内容,如果未能解决你的问题,请参考以下文章

Immutable.js

updateIn immutable.js

Redux & Immutable.js - 从 json 设置状态

在 Immutable.js 中,类型“字符串”不可分配给 keyof

React Redux:在 Reduce 状态下使用不可变

immutable.js文档