我是immutableJS库的新手,我的javascript可能比它好很多。
我有一个使用redux的反应项目,我读过最佳实践是让你存储不可变,所以知道我已经查找了一些方法,并决定使用ImmutableJS,特别是使用他们的Record类
但似乎我在路上迷路了。
以下是我的设置:
我在这里创建了我的记录。
const Form = Record({
id: 0,
status: "",
name: "default",
action: "",
method: "",
submit: "",
fields: new Field()
});
const Entity = Record({
id: undefined,
status: "",
messages: new Message(),
redirectTo: "",
entityType: "",
isFetching: false,
lang: "",
title: "",
charset: "",
viewport: "",
description: "",
keywords: "",
forms: new Form(),
socialLoginText: "",
forgotPasswordLinkText: "",
registerLinkText: ""
});
如您所见,我已创建其他记录并添加了主要实体记录。
现在导入我的实体后,我正在设置我的initialState,在这里:
const entity = new Entity()
const initialState = OrderedMap().mergeDeep(entity)
如果我是正确的,这应该使我的initialState成为我希望我的状态进入的完全不可变结构,同时也允许它访问记录默认值。
接下来,我执行一个Fetch操作并规范化响应,从而为我提供此输出:
{fields: {…}, forms: {…}, messages: {…}, entity: {…}}
entity:{0: {…}}
fields:{0: {…}, 1: {…}, 2: {…}}
forms:{0: {…}, 1: {…}}
messages:{0: {…}, 1: {…}, 3: {…}}
这对我来说似乎是正确的,但我可能错了,没有[results]
字段,但我认为它是因为我的API端点提供了一个带有这样嵌套实体的单项数据。
{
id: 0,
status: "success",
redirectTo: "",
messages: [
{
id: 0,
type: "primary",
icon: "https://s3.amazonaws.com/uifaces/faces/twitter/ripplemdk/128.jpg",
title: "error nam enim",
message: "Illum minus velit voluptatum voluptate.",
dismissable: true,
dismissAfter: 0,
redirect: false,
redirectTo: "",
redirectAfter: 0
} ...
假设我之前没有出错...这就是我认为我出错的地方任何不可变记录/地图都搞砸了。
我正在调用此函数来使用Immutable的fromJS将我的对象转换为地图和列表。
mergeEntities(state, fromJS(action.payload.entities)
然后我将我的状态OrderedMap与我的新Map数据合并,在此过程中调用了几个辅助方法。
const mergeEntities = (state, payload) => {
return state.merge(
entity.setFetching(false),
entity.setStatus('success'),
payload.map(
(id) => new Entity(id)
)
)
}
我迭代地图创建我的实体记录的实例,这是我认为我出错的地方。顶级的一切都很好,我可以打电话:
state.entity.get('forms')
然后它返回表格Map,然后事情变得有点奇怪,以获得我必须使用的特定表格:
state.entity.get('forms')._map.get('0')
返回表单Map,然后这就是我被困住的地方,使用:
state.entity.get('forms')._map.get('0').get('fields')
返回undefined,... ._map.get('0')
的控制台日志如下所示:
可能有多个地方我出错了,一些帮助和指导会非常感激。
答案 0 :(得分:0)
我的记录基于API状态,而不是我创建的Normlized状态模式,我使用最顶层的Record来创建所有嵌套的地图结构。