前端
PythonJava运维数据库
TanStack Query
TanStack Query
  • getting started
    • 快速开始
    • 开发工具
    • Typescript
    • 默认配置
    • 网络模式
  • Query
    • 查询
    • 查询键
    • 查询函数
    • 查询选项
    • 并行查询
    • 有依赖的查询
    • 查询状态指示器
    • 窗口聚焦重新获取数据
    • 禁用/暂停查询
    • 查询重试
    • 分页查询
    • 无限查询
    • 初始化查询数据
  • 占位符
  • Mutation
    • 修改 Mutations
    • 主动查询失效 Query Invalidation
    • 修改导致的失效 Invalidation From Mutations
    • 通过修改的数据更新查询内容
    • 乐观更新
  • 取消查询
  • 默认查询函数
  • 过滤器
  • Suspense
  • 缓存数据
  • Api Reference
    • QueryClient
    • QueryCache
    • MutationCache
    • QueryObserver QueriesObserver
    • InfiniteQueryObserver
    • FocusManager
    • NotifyManager
    • useQuery
    • useQueries useInfiniteQuery
    • useMutation
    • useIsFetching
    • useIsMutating
    • useMutationState
    • useSuspenseQuery
    • useSuspenseInfiniteQuery
    • useSuspenseQueries
    • QueryClientProvider
    • useQueryClient
    • queryOptions
    • infiniteQueryOptions
    • QueryErrorResetBoundary
    • useQueryErrorResetBoundary
    • hydration
由 GitBook 提供支持
在本页
  • 占位符数据作为值
  • 占位符数据记忆化
  • 函数
  • 来自缓存的占位数据

这有帮助吗?

占位符

占位符允许查询的状态表现得好像已经有数据一样,类似于 initialData 选项,但数据不会持久保存到缓存中。

当我们使用 placeholderData 选项时,查询将不会处于 pending 状态, 它将以 success 状态开始,因为我们有数据要显示 , 即使该数据只是占位符数据。为了将其与真实数据区分开来,我们还将在查询结果上将isPlaceholderData标志设置为true。

占位符数据作为值

const userQuery = useQuery({
  queryKey: ["users", id],
  queryFn: async () => {
    await sleep(2000);
    return fetch(`http://localhost:3000/${id}`).then((res) => res.json());
  },
  placeholderData: { id: 1, name: "John Doe", email: "alice@example.com" }
});

占位符数据记忆化

如果占位符数据的计算过程很繁琐,或者你不想每次在渲染时都执行此操作,那么你可以记住该值

const placeholderData = useMemo(() => ({ id: 1, name: "John Doe", email: "alice@example.com" }), []);
const userQuery = useQuery({
  queryKey: ["users", id],
  queryFn: async () => {
    await sleep(2000);
    return fetch(`http://localhost:3000/${id}`).then((res) => res.json());
  },
  placeholderData
});

函数

placeholderData 也可以是一个函数,你可以通过访问上一个成功查询到的数据和和查询元信息,当 queryKey 发生变化时,例如从["users",1]变为["users",2]时,我们可以继续显示旧数据,而不是在数据从一个查询转换到下一个查询时显示加载状态的 UI。

const userQuery = useQuery({
  queryKey: ["users", id],
  queryFn: async () => {
    await sleep(2000);
    return fetch(`http://localhost:3000/${id}`).then((res) => res.json());
  },
  placeholderData: (previousData, previousQuery) => previousData
});

来自缓存的占位数据

在某些情况下,你可以从另一个查询结果的缓存中获取数据提供占位符数据。

const userQuery = useQuery({
  queryKey: ["users", id],
  queryFn: async () => {
    await sleep(2000);
    return fetch(`http://localhost:3000/${id}`).then((res) => res.json());
  },
  placeholderData: (previousData) => {
    return queryClient.getQueryData(["users"])?.find((user) => user.id === previousData.id + 1);
  }
});
上一页初始化查询数据下一页修改 Mutations

最后更新于2个月前

这有帮助吗?