如何在Normalizr中处理没有双向链接的实体关系

时间:2018-07-19 10:47:04

标签: javascript reactjs redux normalizr

我正在将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 ^^?

中添加另一个链接

0 个答案:

没有答案