如果您想阻止查询自动运行,可以使用 enabled = false 选项。enabled 选项也可以接受一个返回布尔值的回调函数。
当 enabled 为 false 时
TypeScript 用户可能更喜欢使用 skipToken 作为 enabled = false 的替代方案。
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { isLoading, isError, data, error, refetch, isFetching } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
enabled: false,
})
</script>
<template>
<button @click="refetch()">Fetch Todos</button>
<span v-if="isLoading">Loading...</span>
<span v-else-if="isError">Error: {{ error?.message }}</span>
<div v-else-if="data">
<span v-if="isFetching">Fetching...</span>
<ul>
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</div>
<span v-else>Not ready...</span>
</template>
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { isLoading, isError, data, error, refetch, isFetching } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
enabled: false,
})
</script>
<template>
<button @click="refetch()">Fetch Todos</button>
<span v-if="isLoading">Loading...</span>
<span v-else-if="isError">Error: {{ error?.message }}</span>
<div v-else-if="data">
<span v-if="isFetching">Fetching...</span>
<ul>
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</div>
<span v-else>Not ready...</span>
</template>
永久禁用查询会使您无法使用 TanStack Query 提供的许多出色功能(例如后台重新获取),而且这也不是惯用的方式。它将您从声明式方法(定义查询何时运行的依赖项)转变为命令式模式(在我点击此处时获取)。此外,也无法将参数传递给 refetch。很多时候,您想要的只是一个延迟初始获取的懒加载查询。
enabled 选项不仅可以用于永久禁用查询,还可以用于在稍后时间启用/禁用它。一个很好的例子是筛选表单,您只想在用户输入筛选值后才触发第一个请求。
<script setup>
import { useQuery } from '@tanstack/vue-query'
const filter = ref('')
const isEnabled = computed(() => !!filter.value)
const { data } = useQuery({
queryKey: ['todos', filter],
queryFn: () => fetchTodos(filter),
// ⬇️ disabled as long as the filter is empty
enabled: isEnabled,
})
</script>
<template>
<span v-if="data">Filter was set and data is here!</span>
</template>
<script setup>
import { useQuery } from '@tanstack/vue-query'
const filter = ref('')
const isEnabled = computed(() => !!filter.value)
const { data } = useQuery({
queryKey: ['todos', filter],
queryFn: () => fetchTodos(filter),
// ⬇️ disabled as long as the filter is empty
enabled: isEnabled,
})
</script>
<template>
<span v-if="data">Filter was set and data is here!</span>
</template>
懒加载查询从一开始就处于 status: 'pending' 状态,因为 pending 意味着还没有数据。虽然这是技术上正确的,但由于我们当前没有获取任何数据(因为查询未启用),这也意味着您可能无法使用此标志来显示加载微调器。
如果您正在使用已禁用或惰性查询,则可以使用 isLoading 标志。它是一个派生标志,由以下条件计算得出:
isPending && isFetching
因此,只有当查询当前首次获取时,它才为 true。
如果您使用 TypeScript,可以使用 skipToken 来禁用查询。当您想基于某个条件禁用查询,但仍希望保持查询的类型安全时,这非常有用。
重要提示:来自 useQuery 的 refetch 不适用于 skipToken。除此之外,skipToken 的工作方式与 enabled: false 相同。
<script setup>
import { useQuery, skipToken } from '@tanstack/vue-query'
const filter = ref('')
const queryFn = computed(() =>
!!filter.value ? () => fetchTodos(filter) : skipToken,
)
const { data } = useQuery({
queryKey: ['todos', filter],
// ⬇️ disabled as long as the filter is undefined or empty
queryFn: queryFn,
})
</script>
<template>
<span v-if="data">Filter was set and data is here!</span>
</template>
<script setup>
import { useQuery, skipToken } from '@tanstack/vue-query'
const filter = ref('')
const queryFn = computed(() =>
!!filter.value ? () => fetchTodos(filter) : skipToken,
)
const { data } = useQuery({
queryKey: ['todos', filter],
// ⬇️ disabled as long as the filter is undefined or empty
queryFn: queryFn,
})
</script>
<template>
<span v-if="data">Filter was set and data is here!</span>
</template>