17
Re:Nuxt 100 天練習曲
Day 17
特殊任務分派 ($fetch & useAsyncData)
Day 17·$fetch·useAsyncData
1. 手動觸發的特種兵:$fetch
如果說 useFetch
是在頁面載入時就自動出任務的正規軍,那 $fetch
就是接到命令才出動的特種兵。
它很單純:你呼叫它,它就去要資料。它不會自動執行,也不會使用我們前天提到的「外帶餐盒 (Payload)」機制。
最佳出場時機
$fetch
最適合用在使用者互動之後的行為,例如:
- 使用者填完表單,按下送出按鈕。
- 使用者點擊「載入更多」按鈕。
- 使用者在搜尋框輸入文字後,觸發搜尋。
範例:送出一個聯絡表單
使用 $fetch 處理表單送出
<script setup>
import { ref } from 'vue';
const name = ref('');
const message = ref('');
const isLoading = ref(false);
async function submitForm() {
isLoading.value = true;
try {
// 在 submitForm 這個函式被呼叫時,才執行 $fetch
const response = await $fetch('/api/contact', {
method: 'POST',
body: { name: name.value, message: message.value }
});
alert('成功送出!');
} catch (error) {
alert('送出失敗:' + error.data.message);
} finally {
isLoading.value = false;
}
}
</script>
<template>
<form @submit.prevent="submitForm">
<input v-model="name" placeholder="姓名">
<textarea v-model="message" placeholder="訊息"></textarea>
<button type="submit" :disabled="isLoading">
{{ isLoading ? '傳送中...' : '送出' }}
</button>
</form>
</template>
重點:useFetch 用於載入頁面,$fetch 用於處理動作。
2. 處理複雜訂單的萬能主廚:useAsyncData
useFetch
是個很棒的點餐系統,但它只接受「網址」這種訂單。如果您的訂單很複雜,就需要請出我們的萬能主廚 useAsyncData
。
事實上,useFetch('/api/user')
只是 useAsyncData('user', () => $fetch('/api/user'))
的簡便寫法。
最佳出場時機
當您的資料來源不是一個簡單的 URL,而是需要:
- 呼叫一個第三方的 SDK (例如:內容管理系統 CMS、支付平台)。
- 同時發出多個 API 請求,再把結果組合成一份資料。
- 執行其他複雜的非同步程式邏輯。
範例:同時獲取文章和會員資料
使用 useAsyncData 處理複雜邏輯
<script setup>
// 第一個參數 'user-dashboard' 是此資料的唯一 key,用於快取
// 第二個參數是一個非同步函式,定義了獲取資料的複雜邏輯
const { data, pending } = await useAsyncData('user-dashboard', async () => {
// 同時發出兩個請求
const [articles, userProfile] = await Promise.all([
$fetch('/api/my-articles'),
$fetch('/api/me')
]);
// 將兩份資料整理成一個物件再回傳
return { articles, userProfile };
});
</script>
<template>
<div v-if="pending">載入中...</div>
<div v-else>
<h2>{{ data.userProfile.name }} 的文章</h2>
<ul>
<li v-for="article in data.articles">{{ article.title }}</li>
</ul>
</div>
</template>
今日總結
今天過後,您就是一位資料獲取大師了!讓我們回顧一下三位專家的職責:
F
useFetch:頁面載入時的首選,簡單方便,自動處理一切。
$
$fetch:使用者互動後的選擇,手動精準觸發。
A
useAsyncData:處理複雜非同步邏輯時的王牌,提供最大的彈性。
恭喜!您已經完成了為期三天的資料獲取訓練營。您現在已經知道在各種情境下,該派遣哪位專家出馬,來為您的網站獲取寶貴的資料了!