Normalizr - 未达到预期效果

时间:2016-02-18 00:16:04

标签: javascript reactjs redux flux normalizr

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

var ListA = [
    {
        id:1, 
        text: "text1",
        comments : [
            {
                id: 232,
                text: "asfasd"
            },
            {
                id: 333,
                text: "abcsss"
            }
        ]
    }, 
    {id:2, text:"text2", comments:[]}, 
    {id:3, text:"text3", comments:[]}
    ]

我正在尝试规范化这个简单的回复。我不确定我在做什么或者我没有理解normalizr文档有什么问题。

const post = new Schema('posts');
// const comment = new Schema('comments');
// const collection = new Schema('collections');

// post.define({
//  comments : comment,
//  collections : arrayOf(collection)
// });
ListA = normalize(ListA, {
    posts: arrayOf(post)
});

console.log(ListA);

这只会对“result”对象产生相同的响应,而entity对象为空。有人可以帮帮我吗。首先,我试图将帖子正常化,之后就会发表评论。但是我还没有能够跨越第一步。

1 个答案:

答案 0 :(得分:4)

使用normalizr

的几个例子

1)规范化简单对象
仅举例来说

import { Schema, arrayOf } from 'normalizr';
const postSchema = new Schema('posts');

// simple post object
var post = {
  id:1,
  title: "some title"
};

console.log(normalize(post, postSchema));

结果将是

{
   "entities":{
      "posts":{
         "1":{
            "id":1,
            "title":"some title"
         }
      }
   },
   "result":1
}

2)规范化对象数组

import { Schema, arrayOf } from 'normalizr';
const postSchema = new Schema('posts');

// array of posts
var posts = [
  {
    id:1,
    title: "foo"
  },
  {
    id:2,
    title: "far"
  },
  {
    id:3,
    title: "baz"
  }
];

console.log(normalize(posts, arrayOf(postSchema)));

结果将是

{
   "entities":{
      "posts":{
         "1":{
            "id":1,
            "title":"foo"
         },
         "2":{
            "id":2,
            "title":"far"
         },
         "3":{
            "id":3,
            "title":"baz"
         }
      }
   },
   "result":[
      1,
      2,
      3
   ]
}

3)规范化复杂对象

const postSchema = new Schema('posts');
const authorSchema = new Schema('authors');
const commentSchema = new Schema('comments');

postSchema.define({
  author: authorSchema,
  comments: arrayOf(commentSchema)
});

// complex post object
var post = {
  id:1,
  title: "foo",
  author: {
    id: 201,
    name: "Bar Baz"
  },
  comments: [
    {
      id: 1002,
      body: "Some content"
    },
    {
      id: 1003,
      body: "Some content 1003"
    },
    {
      id: 1004,
      body: "Some content 1004"
    }
  ]
};

console.log(normalize(post, postSchema));

结果将是

{
  "entities":{
    "posts":{
      "1":{
        "id":1,
          "title":"foo",
          "author":201,
          "comments":[
          1002,
          1003,
          1004
        ]
      }
    },
    "authors":{
      "201":{
        "id":201,
          "name":"Bar Baz"
      }
    },
    "comments":{
      "1002":{
        "id":1002,
          "body":"Some content"
      },
      "1003":{
        "id":1003,
          "body":"Some content 1003"
      },
      "1004":{
        "id":1004,
          "body":"Some content 1004"
      }
    }
  },
  "result":1
}

所以你可以试试

ListA = normalize(ListA, arrayOf(post));

而不是

 ListA = normalize(ListA, {
    posts: arrayOf(post)
 });