Query 身份、状态与缓存
TanStack Query 的核心不是“自动请求”,而是把服务器状态按 queryKey 建立身份、缓存和生命周期。['todos', userId] 与 ['todos', anotherUserId] 是两份不同的缓存;如果 key 漏掉了会影响结果的变量,切换用户时就可能读到旧数据。
先把输入写进 key
ts
const todoOptions = (userId: string) => ({
queryKey: ['todos', { userId }],
queryFn: ({ signal }: { signal: AbortSignal }) => api.listTodos(userId, signal),
staleTime: 30_000,
})staleTime 决定多久内认为数据新鲜,不是数据在内存中存在多久;缓存回收由 gcTime 等生命周期设置决定。加载中、成功、空结果和错误是不同状态,页面应分别给出反馈。enabled 适合表达前置条件,例如没有 userId 时不发请求,但不要把它当成权限校验。
练习
给“当前租户下的订单列表”设计 query key,要求租户、筛选和分页变化时不会复用错误缓存;写出缺少租户时的行为。
下一步
完成练习后打开本章答案,再回到TanStack Query 课程总览。