And*_*gan 8 javascript reactjs redux normalizr reselect
如何使用normalizr处理标准的关键嵌套标准化JSON API响应{ data: ... }?
例如a Book
{
data: {
title: 'Lord of the Rings',
pages: 9250,
publisher: {
data: {
name: 'HarperCollins LLC',
address: 'Big building next to the river',
city: 'Amsterdam'
},
},
author: {
data: {
name: 'J.R.R Tolkien',
country: 'UK',
age: 124,
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我如何设计模式来处理嵌套数据键?
对于响应中的每个实体,您应该创建自己的架构.
在您的例子中,我们有三个实体- books,authors和publishers:
// schemas.js
import { Schema } from 'normalizr';
const bookSchema = new Schema('book');
const publisherSchema = new Schema('publisher');
const authorSchema = new Schema('author');
Run Code Online (Sandbox Code Playgroud)
如果某个实体包含应该规范化的嵌套数据,我们需要使用define它的schema方法.该方法接受具有嵌套规则的对象.
如果我们需要规范化publisher和实体的author道具book,我们应该将一个对象传递给与define我们的响应具有相同结构的函数:
// schemas.js
bookSchema.define({
data: {
publisher: publisherSchema,
author: authorSchema
}
});
Run Code Online (Sandbox Code Playgroud)
现在我们可以规范化我们的响应:
import { normalize } from 'normalizr';
import { bookSchema } from './schemas.js';
const response = {
data: {
title: 'Lord of the Rings',
pages: 9250,
publisher: {
data: {
name: 'HarperCollins LLC',
address: 'Big building next to the river',
city: 'Amsterdam'
},
},
author: {
data: {
name: 'J.R.R Tolkien',
country: 'UK',
age: 124,
}
}
}
}
const data = normalize(response, bookSchema);
Run Code Online (Sandbox Code Playgroud)
我相信您所追求的是使用assignEntity可以在 的选项中传递的函数normalize。在这种情况下,它允许我们在适当的情况下过滤掉冗余data属性并直接转到下面的值。
assignEntity让您有效地控制数据每个键的标准化方式。请查看此处,了解更多有关其工作原理的信息。
我把它放在一起作为演示,看看:http://requirebin.com/?gist =b7d89679202a202d72c7eee24f5408b6 。这是一个片段:
book.define({
data: {
publisher: publisher,
author: author,
characters: normalizr.arrayOf(character)
}}
);
publisher.define({
data: {
country: country
}
});
const result = normalizr.normalize(response, book, { assignEntity: function (output, key, value, input) {
if (key === 'data') {
Object.keys(value).forEach(function(d){
output[d] = value[d];
})
} else {
output[key] = value;
}
}});
Run Code Online (Sandbox Code Playgroud)
另请特别参见 Ln 29,其中 的 数组characters有一些对象,其中嵌套了信息data,而另一些对象则没有嵌套信息。全部都正确标准化。
我还添加了一些部分来展示它如何处理数组和深层嵌套数据,请参阅country中的模型publisher。
使用提供的数据,由于缺少 id,您将需要一个 slug,每个模式也包含在示例中。
Normalizr 太棒了,我希望能帮助解释更多一点:)
| 归档时间: |
|
| 查看次数: |
1898 次 |
| 最近记录: |