Immutable.js - fromJS 生成 Record 代替 Map

Immutable.js - fromJS generate Record in place of Map

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

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

这让我想到了我的问题,目前来自 JS returns 列表和地图,是否可以用记录替换地图?

这将使我的组件与不可变组件分离并具有原生属性,例如 user.name 而不是 user.get('name')

我读过一些关于 revivers 的资料,但似乎找不到类似的用例。

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

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);

});

谢谢

已更新

我将其封装在一个小包中,可以为您完成此操作: 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 就是一个很好的例子。如果存在冲突,您将收到以下消息,但没有指出问题出在哪里:

Uncaught Error: Cannot set on an immutable record