Redux: Почему библиотека Normalizr не работает? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь использовать Normalizr до Сглаживание состояния Redux.Вот определения схемы

import { normalize, schema } from 'normalizr'

const fooSchema = new schema.Entity('foos')
const barSchema = new schema.Entity('bars')

const fooMemberSchema = new schema.Entity('fooMembers', {
    foo: fooSchema
})
const barMemberSchema = new schema.Entity('barMembers', {
    bar: barSchema
})

 export { fooSchema, barSchema, fooMemberSchema, barMemberSchema }

А вот вызов normalize в функции doGet

import axios from 'axios'
import { normalize } from 'normalizr'
import { Promise } from 'es6-promise'
import querystring from 'querystring'
import { CONTEXT_PATH, API_PATH } from '../properties/Properties'

import { fooSchema, barSchema, fooMemberSchema, barMemberSchema } from '../stores/Schema'

/**
 * Tuomas Toivonen
 * 13.1.2019
 */

// Backend mock for development and debugging purposes
const Api = {

    resources: {
        foo: {},
        bar: {}
    },

    doGet({ uri, config={} }) {
        // TODO: tokenize uri
        let data = Object.values(this.resources[uri])
        console.log(data)
        console.log(normalize(data, [fooSchema]))
        return Promise.resolve({data: data})
    },

    doPost({ uri, entity, config={} }) {
        let id = entity.id
        if (!id) {
            id = guid()
            entity.id = id
        }

        this.resources[uri][id] = entity
        return Promise.resolve({data: entity})
    },

    doPut({ uri, entity, config={} }) {
        Promise.reject({message: "doPut not implemented"})
    },

    doDelete({ uri, entity, config={} }) {
        Promise.reject({message: "doDelete Not implemented"})
    }
}

// Generate dummy data
for (let i=0; i<3; i++) {
    let fooId = guid()
    let barId = guid()

    Api.resources.foo[fooId] = {
        id: fooId,
        value: `Foo ${i}`,
        fooMembers: [
            ...(function*() {
                for (let i=0; i<5; i++)
                    yield { id: guid(), value: `FooMember ${i}` }
                })()
            ]
        }
    Api.resources.bar[barId] = {
        id: barId,
        value: `Bar ${i}`,
        barMembers: [
            ...(function*() {
                for (let i=0; i<5; i++)
                    yield { id: guid(), value: `BarMember ${i}` }
                })()
            ]
        }
}

console.log('Using mock API:')
console.log(Api)

function guid() {
  function s4() {
    return Math.floor((1 + Math.random()) * 0x10000)
      .toString(16)
      .substring(1);
  }
  return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}

export default Api

Однако это не нормализует структуру какожидается.Вот сообщения журнала консоли:

Полезная нагрузка до нормализации: Payload before normalization

Полезная нагрузка после нормализации: Payload after normalization

FooMembers все еще вложены по некоторым причинам.Почему это так?

1 Ответ

0 голосов
/ 22 января 2019

Схема, в которую вы передаете, является массивом единственной сущности, у которой нет реального определения:

const fooSchema = new schema.Entity('foos')
normalize(data, [fooSchema])

Это означает, что normalizr думает, что получает массив сущности.И это все.

Похоже, вы показываете, что хотите, чтобы fooMembers было связано с fooSchema.Для этого вам необходимо правильно определить fooSchema:

const fooMemberSchema = new schema.Entity('fooMembers'); 
const fooSchema = new schema.Entity('foos', { fooMembers: [fooMemberSchema] });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...