如何使用Normalizr处理基本的嵌套JSON?

Don*_*n P 3 redux normalizr

我有一个非常标准的嵌套JSON响应. 项目有很多仪表板.仪表板有很多图表.

定义和使用我的模式的正确方法是什么?

下面是我的Schemas.js的代码,我的API响应以及Normalizr将我的API响应转换为的内容.

Schemas.js:

import { Schema, arrayOf, normalize } from 'normalizr';

// Create a schema for each model.
const project = new Schema('projects');
const dashboard = new Schema('dashboard');
const chart = new Schema('chart');

// Projects have many dashboards.
project.define({
  dashboards: arrayOf(dashboard)
});

// Dashboards have many charts.
dashboard.define({
  charts: arrayOf(chart)
});

export const Schemas = { project, dashboard, chart };
Run Code Online (Sandbox Code Playgroud)

我的API响应:

{
  projects: [{
    id: 1,
    name: "Project 1",
    dashboards: [{
      id: 1,
      name: "Dashboard 1",
      charts: [{
        id: 1,
        name: "Chart 1"
      },
      {
        id: 2,
        name: "Chart 2"
      }]
    },
    {
      id: 2,
      name: "Dashboard 2",
      charts: [{
        id: 3,
        name: "Chart 3"
      },
      {
        id: 4,
        name: "Chart 4"
      }]
    }]
  },
  {
    id: 2,
    name: "Project 2",
    dashboards: [{
      id: 3,
      name: "Dashboard",
      charts: []
    }]
  }]
}
Run Code Online (Sandbox Code Playgroud)

当我在一个动作中收到这个JSON时normalize(response, Schemas.project);.这似乎将整个回应转化为entities.projects.undefined.

{
  entities: {
    projects: {
      undefined: {
        projects: [{
          id: 1,
          name: "Project 1",
          ...
        }, ...]
      }
    }
  },
  result: undefined
}
Run Code Online (Sandbox Code Playgroud)

我该如何正确定义和使用我的模式呢?

参考文献:

https://github.com/gaearon/normalizr

https://github.com/reactjs/redux/blob/master/examples/real-world/actions/index.js

bry*_*nph 5

这应该会给你想要的结果:

normalize(response, {
    projects: arrayOf(Schemas.project)
});
Run Code Online (Sandbox Code Playgroud)

项目键是必需的,因为您的响应中有一个额外的键,而arrayOf()表示API返回一组结果.