我正在将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",
}
}
}
}
我的方法是在减速器中处理事情。
这是书籍动作创建者(我在使用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 ^^?
中添加另一个链接