我刚刚更新到normalizr版本3.1.x,因此可以利用非规范化。尽管他们已经大大改变了他们的API。我在转移模式时遇到麻烦。

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

const usersSchema =  new Schema('users')
const photosSchema =  new Schema('photos')
const phonesSchema =  new Schema('phones')

photosSchema.define({
  users: arrayOf(usersSchema)
})

phonesSchema.define({
  users: arrayOf(usersSchema)
})

usersSchema.define({
  photos: valuesOf(photosSchema),
  phones: valuesOf(phonesSchema)
})


那是我现有的用户模式。我也在redux动作中使用了redux-normalizr middleware,所以我将模式连接到动作如下:

import { usersSchema } from '../normalizrSchemas/usersSchemas.js'
import { arrayOf } from 'normalizr'

export function getUsers(data) {
  return  {
    type: 'GET_USERS',
    payload: data,
    meta: {
      schema : arrayOf(usersSchema)
    }
  }
}


这是我第一次尝试转换架构。似乎您不能像使用arrayOf一样调用schema.Array,所以我认为我需要将数组调用移到架构中。

import { schema } from 'normalizr';

const photos = new schema.Entity('photos')
const phones = new schema.Entity('phones')
const user = new schema.Entity('user', {
    photos: [photos],
    phones: [phones]
})

const users= new schema.Array('users', user)

export { users }


动作是相同的,但是我删除了将模式包装在arrayOf中。所有用户数据都只是在没有任何规范的情况下转储到结果中。数据是用户对象的列表,每个对象都包含一个id,normalizr应该选择该ID。我正在努力弄清楚如何使normalizr标识它是我认为的对象数组。

最佳答案

schema.Array不接受键字符串名称(docs)。第一个参数应该是架构定义。所以代替

const users= new schema.Array('users', user)


您应该使用:

const users = new schema.Array(user)


或者,您可以只将速记用于单个实体类型的数组:

const users = [ user ];

10-08 16:48