数据缓存控制

在大部分情况下利用React Query自带的缓存控制策略就已经可以很好很高效的完成数据的获取工作。但是在一些数据被修改以后,那么让苦等React Query自动控制的缓存过期机制就有一些不合适宜了,这时就需要使用QueryClient中提供的缓存过期通知功能来使React Query得知缓存中的某些数据已经过期而启动数据的重新获取过程。

React Query在QueryClient中通过invalidateQueries方法提供了失效全部查询缓存和失效指定查询缓存的方法。这个方法的调用就像是启动了一个链式反应,React Query会无视之前查询中的所有配置,直接将缓存的查询结果标记为过期状态,并且在后台启动对这些过期数据的重新获取的过程。

以下是invalidateQueries的使用格式示例。

// 将已经缓存的所有查询都标记为过期状态
queryClient.invalidateQueries();
// 将已经缓存的指定查询标记为过期状态
queryClient.invalidateQueries('things');

有了这个方法,就可以结合到数据更新的过程中,在数据更新完成以后使React Query自动重新获取最新的数据了。以下是数据缓存控制与数据更新的组合示例。

function NewThing() {
  const queryClient = useQueryClient();
  const mutation = useMutation(
    newThingForm => {
      return axios.post(`/api/things`, newThingForm);
    },
    {
      onSuccess: () => {
        queryClient.invalidateQueries('things');
      }
    }
  );

  return (
    <>
      {mutation.isLoading ? <div>正在添加数据...</div> : null}
      {mutation.isError ? <div>出现错误:{mutation.error.message}</div> : null}
      <button onClick={() => mutation.mutate({ id: new ID(), name: 'the new one' })}>创建新记录</button>
    </>
  );
}

在使用invalidateQueries方法的时候,指定要标记为过期的查询的Key也同样遵循useQuery中对于查询Key的匹配原则。