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的主要内容,如果未能解决你的问题,请参考以下文章
Redux & Immutable.js - 从 json 设置状态