合并嵌套的ImmutableJS记录不会给我未定义的嵌套实体

时间:2018-01-18 21:28:36

标签: javascript reactjs ecmascript-6 react-redux immutable.js

我是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')的控制台日志如下所示:

enter image description here

可能有多个地方我出错了,一​​些帮助和指导会非常感激。

1 个答案:

答案 0 :(得分:0)

我的记录基于API状态,而不是我创建的Normlized状态模式,我使用最顶层的Record来创建所有嵌套的地图结构。