如何解决未设置 QueryClient,在 React Query v3 中使用 QueryClientProvider 设置一个

时间:2021-01-30 20:34:31

标签: reactjs react-query

我的代码如下:

import { useQuery, QueryClientProvider, QueryClient } from 'react-query'
import React from 'react'

const queryClient = new QueryClient()

const fetchData = async () => {
  return (await fetch(`http://jservice.io/api/random?count=50`)).json()
}

function App() {

  const [isLoading, error, data] = useQuery('qa', fetchData)

  console.log(data)


  return (

    <QueryClientProvider client={queryClient}>
      <div className="App">
      </div>
    </QueryClientProvider>

  );
}

export default App;

我使用了 React Query v3 中的确切示例并且仍然得到

Error: No QueryClient set, use QueryClientProvider to set one

我正处于完全放弃图书馆并求助于其他选择的边缘。

2 个答案:

答案 0 :(得分:4)

QueryClientProvider 放在 React 应用的根目录下。

我猜在索引文件中。

此时函数尝试运行 hook useQuery hook 查询客户端缓存未初始化,这将触发该错误。

如果您不想将其保留在索引中,至少它应该在与您使用 useQueryuseMutation 或任何钩子的位置不同的父函数中。

答案 1 :(得分:0)

我从他们关于使用查询客户端的官方文档中找到了这个, 只需转到您的根文件,可能是 App.js 或 Index.js 并用

     <QueryClientProvider client={queryClient}>
       <Todos />
     </QueryClientProvider>
import {
  useQuery,
  useMutation,
  useQueryClient,
  QueryClient,
  QueryClientProvider,
} from 'react-query'
import { getTodos, postTodo } from '../my-api'

// Create a client
const queryClient = new QueryClient()

function App() {
  return (
    // Provide the client to your App
    <QueryClientProvider client={queryClient}>
      <Todos />
    </QueryClientProvider>
  )
}

function Todos() {
  // Access the client
  const queryClient = useQueryClient()

  // Queries
  const query = useQuery('todos', getTodos)

  // Mutations
  const mutation = useMutation(postTodo, {
    onSuccess: () => {
      // Invalidate and refetch
      queryClient.invalidateQueries('todos')
    },
  })

  return (
    <div>
      <ul>
        {query.data.map(todo => (
          <li key={todo.id}>{todo.title}</li>
        ))}
      </ul>

      <button
        onClick={() => {
          mutation.mutate({
            id: Date.now(),
            title: 'Do Laundry',
          })
        }}
      >
        Add Todo
      </button>
    </div>
  )
}

render(<App />, document.getElementById('root'))