我正在将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中添加另一个链接^^?