我正在将normalizr添加到redux应用程序中,并且我在处理从API返回的数据中的单向链接时遇到了棘手的问题 .
进行两个单独的API调用,第一个返回作者:
author = {
...authorFields,
}
第二个返回书籍列表:
books = [
{
...bookFields,
authorId,
},
...
]
这是我的normalizr架构:
const book = new schema.Entity('books')
const author = new schema.Entity('authors', {
books: [ book ],
})
book.define('book', {
author,
})
在我们的API响应中,我们只在书中有一个链接,而不包含在作者中 . 只是在案例上调用 normalize()
将不会给我们想要的良好规范化状态 .
我的目标状态是这个(如果来自API的作者响应包含书籍作为嵌套实体,我们将得到的规范化状态):
{
authors: {
"101": {
...authorFields
books: [
"1001",
"1002",
etc...
]
}
books {
"1001" : {
"1001": {
...bookFields,
author: "101",
},
"1002": {
...bookFields,
author: "101",
}
}
}
}
我的方法是处理reducer中的东西 .
这是书籍动作创作者(我正在使用thunk):
function fetchBooksForAuthor(authorId) {
return (dispatch, _, schema) => {
return getBooksFromAPIByAuthor(authorId)
.then(books => {
const normalizedData = normalize(books, [ schema.book ])
dispatch(addBooks({
authorId,
...normalizedData
}))
})
}
}
以下是减速器:
function books(state = {}, action) {
switch (action.type) {
case ADD_BOOKS:
return {
...state,
...action.payload.entities.books
}
...
}
}
function authors(state = {}, action) {
switch (action.type) {
case ADD_BOOKS:
const authorId = action.payload.authorId
const author = state[authorId]
return {
...state,
[authorId]: {
...author,
...action.payload.result
}
}
...
}
}
这是处理此类案件的最佳方式吗?有没有办法在normalizr中完全处理这种类型的案件?如果没有,有没有人有任何关于处理这个问题的最佳方法的建议?在API中添加另一个链接^^?