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
我一直在玩 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