2017-01-19 2 views
0

Je viens de mettre à jour vers normalizr version 3.1.x afin que je puisse utiliser la dénormalisation. Bien qu'ils aient considérablement changé leur API. J'ai du mal à transférer mes schémas.J'ai du mal à convertir le schéma de Normalizr v2 en v3

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) 
}) 

C'était mon schéma existant pour les utilisateurs. Je suis également en utilisant l'redux-normalizr middleware dans mon action Redux, donc je connecté le schéma à mon action comme ceci:

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

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

Ce fut ma première tentative de convertir le schéma sur. Il semble que vous ne pouvez pas appeler schéma. Array de la même façon que vous pourriez utiliser arrayOf, donc je pensais que je devais déplacer l'appel de tableau dans le schéma.

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 } 

l'action est la même, mais j'ai supprimé l'encapsulation du schéma dans arrayOf. Toutes les données des utilisateurs sont simplement déversées dans les résultats sans aucune normalisation. Les données sont une liste d'objets utilisateur, et chaque objet contient un identifiant que normalizr devrait détecter. J'ai du mal à trouver comment obtenir normalizr l'identification que c'est un tableau d'objet je pense.

Répondre

2

schema.Array n'accepte pas de nom de chaîne de clé (docs). Le premier argument devrait être la définition du schéma. Ainsi, au lieu de

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

Vous devez utiliser:

const users = new schema.Array(user) 

Ou, vous pouvez simplement utiliser le raccourci pour un tableau d'un seul type d'entité:

const users = [ user ]; 
+0

hmm. il sems il n'a pas aimé le raccourci, cracher 'index.js: 179 Erreur Uncaught: Normalize accepte un objet pour le schéma. Bien qu'il ait accepté la forme longue 'new schema.Array (fournisseur)'. Pourtant, tous les objets utilisateur sont toujours placés dans le tableau des résultats, et les entités sont vides. Je me suis fatigué de simplifier mon code en supprimant les photos et les téléphones. Peut-être que je trouverai plus d'informations dans les docs – DigitalDisaster

+0

Eh bien, il semble que Redux-normalizr ne soit pas compatible avec la version 3. Quand utiliser 'normalize' dans mon réducteur avec le schéma fonctionne très bien. C'est dommage que je doive me débarrasser du middleware, mais je suis ravi d'utiliser normalizr v3! Je vous remercie! – DigitalDisaster