useAsyncData
useAsyncData 提供在適合伺服器端渲染的組合式函式中,非同步解析資料的存取。
在您的頁面、元件和外掛程式中,您可以使用 useAsyncData 來存取非同步解析的資料。
useAsyncData
是一個組合式函式,旨在直接在 Nuxt 上下文 中呼叫。它會回傳響應式組合式函式,並處理將回應新增至 Nuxt 有效負載,以便它們可以從伺服器傳遞到客戶端,而無需在頁面水合時於客戶端重新抓取資料。用法
pages/index.vue
<script setup lang="ts">
const { data, status, error, refresh, clear } = await useAsyncData(
'mountains',
() => $fetch('https://api.nuxtjs.dev/mountains')
)
</script>
如果您使用自訂的 useAsyncData 包裝器,請勿在組合式函式中等待它,因為這可能會導致意料之外的行為。請參考此指南,以取得關於如何製作自訂非同步資料抓取器的更多資訊。
data
、status
和 error
是 Vue 響應式參考,當在 <script setup>
中使用時,應使用 .value
存取,而 refresh
/execute
和 clear
則是一般函式。監看參數
內建的 watch
選項允許在偵測到任何變更時自動重新執行抓取器函式。
pages/index.vue
<script setup lang="ts">
const page = ref(1)
const { data: posts } = await useAsyncData(
'posts',
() => $fetch('https://fakeApi.com/posts', {
params: {
page: page.value
}
}), {
watch: [page]
}
)
</script>
useAsyncData
是一個由編譯器轉換的保留函式名稱,因此您不應將您自己的函式命名為 useAsyncData
。參數
key
:一個唯一鍵,以確保可以跨請求正確地去重複化資料抓取。如果您未提供鍵,則會為您產生一個對於useAsyncData
實例的檔案名稱和行號而言是唯一的鍵。handler
:一個非同步函式,必須回傳一個真值(例如,它不應為undefined
或null
),否則請求可能會在客戶端重複。handler
函式應為無副作用的,以確保在伺服器端渲染和客戶端渲染水合期間的可預測行為。如果您需要觸發副作用,請使用callOnce
工具程式來執行。選項
:server
:是否在伺服器上抓取資料(預設為true
)lazy
:是否在載入路由後解析非同步函式,而不是阻止客戶端導航(預設為false
)immediate
:設定為false
時,將防止請求立即觸發。(預設為true
)default
:一個工廠函式,用於設定data
的預設值,在非同步函式解析之前 - 與lazy: true
或immediate: false
選項一起使用時很有用transform
:一個函式,可用於在解析後更改handler
函式結果getCachedData
:提供一個回傳快取資料的函式。null
或undefined
回傳值將觸發抓取。預設情況下,這是僅在啟用const getDefaultCachedData = (key, nuxtApp) => nuxtApp.isHydrating ? nuxtApp.payload.data[key] : nuxtApp.static.data[key]
nuxt.config
的experimental.payloadExtraction
時快取資料。pick
:僅從handler
函式結果中挑選此陣列中指定的鍵watch
:監看響應式來源以自動重新整理deep
:在深層響應式參考物件中回傳資料(預設為true
)。可以將其設定為false
以在淺層響應式參考物件中回傳資料,如果您的資料不需要深層響應式,這可以提升效能。dedupe
:避免一次抓取相同鍵多次(預設為cancel
)。可能的選項cancel
- 在建立新請求時取消現有請求defer
- 如果有待處理的請求,則完全不建立新請求
在底層,
lazy: false
使用 <Suspense>
來阻止路由的載入,直到資料被抓取。考慮使用 lazy: true
並實作載入狀態,以獲得更流暢的使用者體驗。回傳值
data
:傳入的非同步函式的結果。refresh
/execute
:一個函式,可用於重新整理handler
函式回傳的資料。error
:如果資料抓取失敗,則為錯誤物件。status
:一個字串,指示資料請求的狀態idle
:當請求尚未開始時,例如- 當
execute
尚未被呼叫且設定了{ immediate: false }
時 - 當在伺服器上渲染 HTML 且設定了
{ server: false }
時
- 當
pending
:請求正在進行中success
:請求已成功完成error
:請求已失敗
clear
:一個函式,它會將data
設定為undefined
、將error
設定為null
、將status
設定為'idle'
,並將任何目前等待中的請求標記為已取消。
預設情況下,Nuxt 會等待 refresh
完成後,才能再次執行。
如果您未在伺服器上抓取資料(例如,使用
server: false
),則資料將不會被抓取,直到水合完成。這表示即使您在客戶端等待 useAsyncData
,data
在 <script setup>
中仍將保持 null
。類型
簽名
function useAsyncData<DataT, DataE>(
handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
options?: AsyncDataOptions<DataT>
): AsyncData<DataT, DataE>
function useAsyncData<DataT, DataE>(
key: string,
handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
options?: AsyncDataOptions<DataT>
): Promise<AsyncData<DataT, DataE>>
type AsyncDataOptions<DataT> = {
server?: boolean
lazy?: boolean
immediate?: boolean
deep?: boolean
dedupe?: 'cancel' | 'defer'
default?: () => DataT | Ref<DataT> | null
transform?: (input: DataT) => DataT | Promise<DataT>
pick?: string[]
watch?: WatchSource[]
getCachedData?: (key: string, nuxtApp: NuxtApp) => DataT | undefined
}
type AsyncData<DataT, ErrorT> = {
data: Ref<DataT | null>
refresh: (opts?: AsyncDataExecuteOptions) => Promise<void>
execute: (opts?: AsyncDataExecuteOptions) => Promise<void>
clear: () => void
error: Ref<ErrorT | null>
status: Ref<AsyncDataRequestStatus>
};
interface AsyncDataExecuteOptions {
dedupe?: 'cancel' | 'defer'
}
type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error'