javascript - 如何使用 react-query 将来自不同 react-query Hook 的数据同步连接在一起?

标签 javascript reactjs react-hooks react-query

我有三种不同的数据类型:BooksAuthorsPublishers。我使用 react-query 获取每种类型的列表,即 useBooks(bookIds)useAuthors(authorIds)usePublishers(publisherIds) 和当我尝试彼此独立地使用它们时,这非常有用。

但是,一本书有一个 authorIdspublisherIds 的列表,我想加入 PublishersAuthors Books 的对象。我无法找出使用 react 查询执行此操作的正确方法。理想情况下,我希望能够调用所有三个钩子(Hook),等待它们的响应,然后将其作为一个大钩子(Hook)返回。但是,我不能全神贯注地去做这件事。

我尝试的一个实现是让每个将数据连接到 Book 的 Hook 都依赖于前一个 Hook 的结果。这行得通;然而,最大的问题是连接是彼此异步完成的;一旦返回数据,组件使用的数据不能指望 BookAuthorPublisher。这是一个例子:

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 Hook 的查询函数中调用所有三个 Hook ,但 Hook 规则不允许我这样做。

最佳答案

由于不知道您的 useBooksuseAuthorsusePublishers Hook 在内部如何工作,我无法准确回答,但我会接近通过编写一个执行所有 API 调用的函数,然后用 useQuery 包装那个函数来解决问题。您不想有条件地调用不同的 Hook ,因为这违反了 rules of hooks 之一。 : “不要在循环、条件或嵌套函数中调用 Hooks。”

像这样:

async function getBookDetails() {
    const books = await getAllBooks();
    const authorIds = books.map(x => x.authorId);
    const authors = await getAuthorsForIds(authorIds);
    const publisherIds = books.map(x => x.publisherId);
    const publishers = await getPublishersForIds(publisherIds);
    return { books, authors, publishers };
}

然后你可以像这样将它包装在一个 useQuery 中:

const result = useQuery("book-details", getBookDetails);

这假设如果任何查询都没有结果,您将得到一个空数组 [],而不是 null 或 undefined。

如果您不熟悉 Array.map,可以继续阅读 here .

关于javascript - 如何使用 react-query 将来自不同 react-query Hook 的数据同步连接在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64582954/

相关文章:

reactjs - 正在发送没有授权 header 的 React 请求

javascript - 取消异步 Axios GET 请求 - React hooks

javascript - 如何在jest和enzyme中设置useState Hook的初始状态?

reactjs - 在单击按钮时 react 添加和删除组件

javascript - React HOC 在 Lifecycle 方法中使用 Context API

javascript - 如何通过在普通 JavaScript 中动态附加的类名获取所有选择器?

javascript - javascript函数中返回对象的范围

javascript - HTML/CSS : How to fade the left and right edges of a div?

javascript - 使用 React testutils 模拟拖放不起作用

javascript - 知道为什么 knockoutjs 会从页面中删除所有 html 内容吗?