ByteNoteByteNote

字节笔记本

2026年2月15日

TanStack 缓存管理完全指南

API中转
¥120

TanStack 的数据缓存机制

TanStack Query(以前叫 React Query)提供了强大的数据缓存系统。以下是核心概念:

缓存的基本原理

当你使用 useQuery 获取数据时,TanStack Query 会自动将数据缓存在内存中。每个查询通过唯一的查询键(query key)来标识。

javascript
const { data } = useQuery({
  queryKey: ['todos'],
  queryFn: fetchTodos
});

缓存时间配置

staleTime:数据被视为新鲜的时间。在此期间内,不会重新请求数据。

  • 默认值:0(立即过期)
  • 设置为 Infinity 可以让数据永不过期

cacheTime (现在叫 gcTime):数据在缓存中保留的时间,即使没有观察者。

  • 默认值:5分钟
  • 超时后,未使用的数据会被垃圾回收
javascript
const { data } = useQuery({
  queryKey: ['todos'],
  queryFn: fetchTodos,
  staleTime: 1000 * 60 * 5, // 5分钟内数据保持新鲜
  gcTime: 1000 * 60 * 10    // 10分钟后清除缓存
});

缓存更新策略

TanStack Query 会在以下情况自动重新获取数据:

  • 窗口重新获得焦点(refetchOnWindowFocus)
  • 网络重新连接(refetchOnReconnect)
  • 组件挂载(refetchOnMount)
  • 定时轮询(refetchInterval)

手动操作缓存

你可以手动操作缓存数据:

javascript
import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

// 使缓存失效
queryClient.invalidateQueries({ queryKey: ['todos'] });

// 直接设置缓存数据
queryClient.setQueryData(['todos'], newData);

// 获取缓存数据
const data = queryClient.getQueryData(['todos']);

// 预取数据
queryClient.prefetchQuery({
  queryKey: ['todos'],
  queryFn: fetchTodos
});

乐观更新

在修改数据时,可以立即更新缓存,提供更好的用户体验:

javascript
const mutation = useMutation({
  mutationFn: updateTodo,
  onMutate: async (newTodo) => {
    await queryClient.cancelQueries({ queryKey: ['todos'] });
    const previousTodos = queryClient.getQueryData(['todos']);
    queryClient.setQueryData(['todos'], (old) => [...old, newTodo]);
    return { previousTodos };
  },
  onError: (err, newTodo, context) => {
    queryClient.setQueryData(['todos'], context.previousTodos);
  },
  onSettled: () => {
    queryClient.invalidateQueries({ queryKey: ['todos'] });
  }
});

这个缓存系统让你可以避免重复请求,提升应用性能,同时保持数据的同步。

分享: