Вы можете включить контейнер как часть определения схемы вашего проекта.
const { schema } = require('normalizr');
const pageSchema = new schema.Entity('pages');
const sectionSchema = new schema.Entity('sections', {
pages: [pageSchema],
});
const projectSchema = new schema.Entity('projects', {
container: {
sections: [sectionSchema],
},
});
В этом случае контейнер не будет нормализован.Трудно рассматривать их как сущности, если они не обладают какими-либо идентифицирующими свойствами.Если это так, вы можете указать это свойство как idAttribute
.
Лучший вариант - преобразовать ответ API и сгенерировать уникальные идентификаторы на некотором уровне между API и нормализатором, но это не даст вам никаких обычных преимуществ, которые вы получите с нормализацией, как указано в связанном вопросе..
Вот как вы денормализуете сущность из нормализованного состояния, используя вышеуказанную схему:
const { normalize, denormalize } = require('normalizr');
const data = {
id: "1",
container: {
sections: [
{
id: "a",
pages: [
{
id: "z"
}
]
}
]
}
};
const state = normalize(data, projectSchema);
// -> {"entities":{"pages":{"z":{"id":"z"}},"sections":{"a":{"id":"a","pages":["z"]}},"projects":{"1":{"id":"1","container":{"sections":["a"]}}}},"result":"1"}
denormalize(1, projectSchema, state.entities);
// -> {"id":"1","container":{"sections":[{"id":"a","pages":[{"id":"z"}]}]}}