我有三种不同的数据类型:Books
、Authors
和Publishers
。我使用 react-query 来获取每种类型的列表,即useBooks(bookIds)
, useAuthors(authorIds)
,usePublishers(publisherIds)
当我尝试相互独立地使用它们时,这非常有用。
但是,一本书有一个 and 的列表,authorIds
我publisherIds
想将Publishers
andAuthors
对象加入到Books
. 我想不出使用 react-query 的正确方法。理想情况下,我希望能够调用所有三个钩子,等待它们的响应,然后将其作为一个大钩子返回。但是,我不能绕着头来做这件事。
我尝试的一种实现是使每个连接数据的钩子都Book
依赖于前一个钩子的结果。这行得通;然而,最大的问题是连接是彼此异步完成的;组件使用的数据不能期望 aBook
有 aAuthor
或Publisher
一旦返回数据。这是一个例子:
const usePopulatedBooks = (bookIds) => {
const booksQuery = useBooks(bookIds);
const {data: books} = booksQuery;
const authorIds = [];
const publisherIds = [];
if (books) {
books.forEach(book => {
authorIds.push(book.authorId);
authorIds.push(book.publisherIds);
})
}
// Who knows when this finishes?
const {data: authors} = useAuthors(authorIds);
// Who knows when this finishes?
const {data: publishers} = usePublishers(publisherIds);
// Adds "author" and "publisher" field (if the authors/publishers array exist) to "book"
const joinedBooks = joinData(books, authors, publishers);
return {...booksQuery, data: joinedBooks};
}
有什么方法可以编写上述逻辑,使得在所有数据都加入之前什么都不返回?在我的脑海中,我这样做的方式是在另一个 react-query 钩子的查询函数中调用所有三个钩子,但钩子规则不允许我这样做。