React-query - 如何在多个组件中访问我的查询?

med*_*ama 12 javascript reactjs react-query

我刚刚开始使用 React 查询,并使用它在 ListBooks 组件中使用 useQuery 从服务器获取书籍列表

const { data, error, isLoading, isError } = useQuery("books", getAllBooks);
Run Code Online (Sandbox Code Playgroud)

如何访问任何其他组件中的图书列表?

我已经像这样设置了 QueryClientProvider :

 const queryCache = new QueryCache({
  onError: (error) => {
    console.log(error);
  },
});

const queryClient = new QueryClient({ queryCache });

ReactDOM.render(
  <React.StrictMode>
    <QueryClientProvider client={queryClient}>
      <ThemeProvider theme={preset}>
        <BrowserRouter>
          <App />
        </BrowserRouter>
      </ThemeProvider>
      <ReactQueryDevtools initialIsOpen={false} />
    </QueryClientProvider>
  </React.StrictMode>,
  document.getElementById("root")
);
Run Code Online (Sandbox Code Playgroud)

我正在寻找 Redux 中 useSelector 的等效项来访问 redux 存储中的数据。

Nea*_*arl 21

react-query根据查询键管理查询缓存,因此在另一个组件中,只要将它们都包装在里面QueryClientProvider,您只需useQuery使用匹配的键(books)进行调用,react-query就会为您返回适当的数据。

如果您在多个位置使用相同的查询,请考虑添加包装器挂钩以保持代码整洁:

function useAllBooks() {
  return useQuery("books", getAllBooks)
}
Run Code Online (Sandbox Code Playgroud)
function Component1() {
  const {...} = useAllBooks()
  return (...)
}

function Component2() {
  const {...} = useAllBooks()
  return (...)
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,通过 queryClient 命令式访问缓存不会创建订阅,因此如果您在渲染函数期间使用它,您的组件将不会重新渲染,并且如果缓存为空,它也不会触发提取。只有“useQuery”可以做到这一点,因此我建议始终使用“useQuery”从缓存中读取数据。 (4认同)

Ran*_*all 10

useGetFetchQuery您可以使用自定义挂钩和useQueryClient进行访问

import { useQueryClient } from "react-query";

export const useGetFetchQuery = (key) => {
    const queryClient = useQueryClient();

    return queryClient.getQueryData(key);
};
Run Code Online (Sandbox Code Playgroud)

在组件中就这样写

const data = useGetFetchQuery("key from useQuery or useMutation");
Run Code Online (Sandbox Code Playgroud)

UPD

正确地注意到@Tony Tai Nguyen与新(v5)版本的react-query查询键应该是一个数组

const data = useGetFetchQuery(["query key"]);
Run Code Online (Sandbox Code Playgroud)

  • 这是获取所有已获取的“数据”的最干净的方法。但变量“数据”不是反应性的 - 这意味着如果数据被重新获取/更新等 - “数据”变量将不会更新/被更新...:( 有没有办法从 a 订阅数据具体查询? (5认同)