基本使用

前一节的示例虽然已经展示了要在一个应用中如何使用React Query,但是并不完整。接下来将使用一个完整的数据获取、数据更新、缓存控制的流程来说明在大部分场景中,React Query的使用方法。

在大部分的应用场景中,我们都需要从服务端取得数据,然后在应用中做出一些操作后,需要将更新的数据保存回服务端,此时我们之前从服务端获取的数据就需要进行刷新。这个数据操作的流程在使用React Query以后,会变得十分简练和清晰。

首先,将React Query引入到应用中,这一步与上一节中的应用启动示例相同。

import { QueryClient, QueryClientProvider } from 'react-query';
import App from './App.tsx';

const queryClient = new QueryClient();

function main() {
  return (
    <QueryClientProvider client={queryClient}>
      <App />
    </QueryClientProvider>
  );
}

接下来,定义两个与服务端进行交互的数据操作方法。

import axios, { AxiosResponse } from 'axios';

export async function getThings(): Promise<Thing[]> {
  return axios.get<Thing[]>('/things');
}

export async function deleteThings(id: number): Promise<AxiosResponse<boolean>> {
  return axios.delete<AxiosResponse<boolean>>(`/things?id=${id}`);
}

然后就可以在组件中使用已经定义好的这些查询了。

import { useMutation, useQuery, useQueryClient } from 'react-query';
import { deleteThings, getThings } from './queries.ts';

function App() {
  const client = useQueryClient();

  const things = useQuery(['things'], getThings);
  const mutation = useMutation(deleteThings, {
    onSuccess: () => {
      client.invalidateQueries(['things']);
    }
  });

  return (
    <div>
      <ul>
        {things.data.map(thing => (
          <li key={thing.id}>
            {thing.name}
            <button onClick={() => mutation.mutate(thing.id)}>Delete</button>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default App;

在这个示例中,每个列表项都带有一个删除按钮,当点击这个按钮的时候,这个列表项就会被删除,并且会重新查询列表内容,刷新整个列表。其中所涉及到的具体功能的使用,将在后面的章节进行进一步说明。