setup() / <script setup> の中で普通に書けるloading, error, data)は ref で管理するasync/await + try...catch + onMounted(または watch)watch でリアクティブ変数の変化に応じて再取得もできるasync を忘れない!<!-- ファイル名: ApiExample.vue -->
<template>
<div>
<p v-if="loading">Loading...</p>
<p v-else-if="error">{{ error }}</p>
<p v-else>Message: {{ message }}</p>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
// 状態を ref で管理
const message = ref<string>('');
const loading = ref(true);
const error = ref<string | null>(null);
// 非同期関数を定義
const fetchData = async () => {
loading.value = true;
error.value = null;
try {
const response = await fetch('<https://api.example.com/data>');
if (!response.ok) throw new Error('データ取得失敗');
const data = await response.json();
message.value = data.message;
} catch (err: unknown) {
// 型が unknown なので型ガードを書く
if (err instanceof Error) {
error.value = err.message;
} else {
error.value = '不明なエラー';
}
} finally {
loading.value = false;
}
};
// マウント時に呼び出し
onMounted(() => {
fetchData();
});
</script>
watch を使う)<!-- ファイル名: WatchApiExample.vue -->
<template>
<input v-model="userId" placeholder="User ID" />
<p v-if="loading">Loading...</p>
<p v-else-if="error">{{ error }}</p>
<p v-else>Username: {{ username }}</p>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
const userId = ref('1');
const username = ref<string>('');
const loading = ref(false);
const error = ref<string | null>(null);
const fetchUser = async (id: string) => {
loading.value = true;
error.value = null;
try {
const response = await fetch(`https://api.example.com/users/${id}`);
if (!response.ok) throw new Error('ユーザー取得失敗');
const data = await response.json();
username.value = data.username;
} catch (err: unknown) {
if (err instanceof Error) {
error.value = err.message;
} else {
error.value = '不明なエラー';
}
} finally {
loading.value = false;
}
};
// userId が変わるたびに再取得
watch(userId, (newId) => {
fetchUser(newId);
}, { immediate: true });
</script>
| シチュエーション | 使うもの | 説明 |
|---|---|---|
| 初回だけ取得したい | onMounted() |
マウント時に一度だけ取得 |
| 変数が変わったら再取得したい | watch() |
依存変数の変化で再取得 |
| 依存自動検知したい | watchEffect() |
依存している変数を自動監視 |
onMounted → 「家に帰ったらすぐごはんを作る」。
watch→ 「お腹が空いたら(条件が変わったら)ごはんを作る」。
watchEffect→ 「冷蔵庫の中身が減ったら自動で買い足す」。