タイトル: メソッドの定義方法
SEOタイトル: Vue.js メソッド定義完全ガイド(Options API / Composition API / setup)
| この記事の要点 |
|
Vue.js のメソッド定義 2 つのスタイル
Vue.js 3 では「Options API」と「Composition API」の 2 つの書き方があり、メソッド定義もそれぞれスタイルが異なります。
1. Options API でのメソッド定義
{{ message }}
Options API のポイント
- すべてのメソッドは
methods:オブジェクト内に並べる - メソッド内では
thisでdata/props/ 他メソッド /computedにアクセス - アロー関数で書いてはいけない(
thisが外側のthisになってしまう) - 非同期処理 (
async/await) もそのまま使える
2. Composition API +
{{ message }}
Composition API のポイント
- メソッドは通常の関数として
内で宣言 thisは存在しない(不要)- ref/reactive の値には
.valueでアクセス(テンプレートでは自動アンラップ) - 外部公開(テンプレートから使える)は宣言するだけで自動
- TypeScript との相性がよい
Options API vs Composition API 早見表
| 項目 | Options API | Composition API + setup |
|---|---|---|
| メソッド宣言 | methods: { greet() {} } | const greet = () => {} |
| データ参照 | this.count | count.value |
this | あり(コンテキスト) | なし |
| アロー関数 | NG(this が変わる) | OK |
| 外部公開 | methods 内に書くだけ | 宣言するだけ |
| TS 補完 | 限定的 | 強力 |
| ロジックの再利用 | mixin(推奨されない) | composables(推奨) |
| 学習コスト | 低 | 中 |
テンプレートからの呼び出し方
伝播止める
右クリック
computed と methods と watch の違い
| 用途 | methods | computed | watch |
|---|---|---|---|
| 計算結果を表示 | 毎回再実行 | ★ キャッシュされる | — |
| クリック等のイベント処理 | ★ これが本職 | — | — |
| 値が変わったときに副作用実行 | — | — | ★ これが本職 |
| 引数を受ける | ○ | ○(が再評価されない) | — |
| 非同期処理 | ○ | ×(同期のみ) | ○ |
{{ formatted() }}
{{ doubled }}
子→親通信: emit
ライフサイクルとメソッドの組合せ
| Options API | Composition API | タイミング |
|---|---|---|
beforeCreate | setup() 直前 | インスタンス作成前 |
created | setup() 内 | インスタンス作成済 / DOM 前 |
beforeMount | onBeforeMount | DOM 挿入直前 |
mounted | onMounted | DOM 挿入後(API 呼出はここ) |
beforeUpdate | onBeforeUpdate | 再レンダリング前 |
updated | onUpdated | 再レンダリング後 |
beforeUnmount | onBeforeUnmount | 破棄直前 |
unmounted | onUnmounted | 破棄完了 |
composables(ロジックの再利用)
Composition API の真価。メソッド + 状態をまとめて切り出し、他のコンポーネントで再利用できます:
// composables/useCounter.js
import { ref, computed } from 'vue';
export function useCounter(initial = 0) {
const count = ref(initial);
const increment = () => count.value++;
const decrement = () => count.value--;
const reset = () => count.value = initial;
const isZero = computed(() => count.value === 0);
const doubled = computed(() => count.value * 2);
return { count, increment, decrement, reset, isZero, doubled };
}
カウント: {{ count }}(2 倍: {{ doubled }})
FAQ
Q: Options API と Composition API はどちらを使うべき?
A: 公式は新規プロジェクトでは Composition API を推奨。ただし Options API も将来も使えます。チームに合わせて選択。
Q: this がうまく動かない
A: Options API の methods 内でアロー関数を使っていないか確認してください。methods: { greet: () => { this.x } } は NG。methods: { greet() { this.x } } が正しい。
Q: @click="greet" と @click="greet()" の違い
A: 前者は関数参照を渡す(イベントオブジェクトが第一引数に入る)、後者はその場で呼び出して戻り値を渡す。引数を渡したいときだけ括弧を付けます。