查詢是與唯一鍵綁定的非同步資料來源的宣告式依賴。查詢可與任何基於 Promise 的方法(包括 GET 和 POST 方法)一起使用,以從伺服器獲取資料。若您的方法會修改伺服器上的資料,建議改用變更 (Mutations)。
要在元件或自訂鉤子中訂閱查詢,請呼叫 useQuery 鉤子並至少提供以下參數:
import { useQuery } from '@tanstack/vue-query'
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
import { useQuery } from '@tanstack/vue-query'
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
您提供的唯一鍵會在內部用於重新獲取、快取及在應用程式中共享查詢。
useQuery 回傳的查詢結果包含所有與查詢相關的資訊,可供模板化或任何其他資料使用:
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
result 物件包含幾個非常重要的狀態,您需要了解這些狀態才能有效使用。查詢在任一時刻只能處於以下其中一種狀態:
除了這些主要狀態外,根據查詢的狀態還可獲取更多資訊:
對於大多數查詢,通常只需檢查 isPending 狀態,接著檢查 isError 狀態,最後假設資料已可用並渲染成功狀態:
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { isPending, isError, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
</script>
<template>
<span v-if="isPending">載入中...</span>
<span v-else-if="isError">錯誤: {{ error.message }}</span>
<!-- 此時可假設 `isSuccess === true` -->
<ul v-else-if="data">
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</template>
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { isPending, isError, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
</script>
<template>
<span v-if="isPending">載入中...</span>
<span v-else-if="isError">錯誤: {{ error.message }}</span>
<!-- 此時可假設 `isSuccess === true` -->
<ul v-else-if="data">
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</template>
若不喜歡布林值,也可以使用 status 狀態:
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { status, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
</script>
<template>
<span v-if="status === 'pending'">載入中...</span>
<span v-else-if="status === 'error'">錯誤: {{ error.message }}</span>
<!-- 同樣 status === 'success',但 "else" 邏輯也適用 -->
<ul v-else-if="data">
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</template>
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { status, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
</script>
<template>
<span v-if="status === 'pending'">載入中...</span>
<span v-else-if="status === 'error'">錯誤: {{ error.message }}</span>
<!-- 同樣 status === 'success',但 "else" 邏輯也適用 -->
<ul v-else-if="data">
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</template>
若您在存取 data 前已檢查過 pending 和 error,TypeScript 也會正確縮小 data 的型別範圍。
除了 status 欄位外,您還會獲得一個額外的 fetchStatus 屬性,其選項如下:
背景重新獲取和過期資料重新驗證邏輯使得 status 和 fetchStatus 的所有組合都有可能出現。例如:
因此請記住,查詢可能處於 pending 狀態但實際上並未獲取資料。作為經驗法則: