🌊

Vue 3で整理するライフサイクルとwatchの基本〜動くタイミングを理解して開発をスムーズに〜

に公開

Vue 3で整理するライフサイクルとwatchの基本

Vueで開発してると、「この処理、どのタイミングで書けばいいんだっけ?」って
ちょっと迷うこと、あると思うんだよね。

特にComposition APIを使ってると、onMountedとかwatchとか
似たようなタイミングのフックがいくつもあって、整理が難しくなりがち。

この記事では、Vueのライフサイクルとwatchの動きをざっくり整理して、
制作中に迷わないようにしていこうと思います。


Vue 3のライフサイクルざっくり整理

Vue 3では、コンポーネントの「生まれてから消えるまで」を
ライフサイクルフックで管理することができる。

ざっくり流れを追うと👇こんな感じ。

タイミング フック名 よく使う用途
コンポーネントが作られる前 setup() 初期化処理(reactive定義など)
DOMに触る前 onBeforeMount マウント前の準備
DOMが生成された後 onMounted DOM操作・API取得など
データ更新前 onBeforeUpdate 更新直前の処理
データ更新後 onUpdated 再描画後の確認など
コンポーネントが破棄される前 onBeforeUnmount イベント解除など
破棄後 onUnmounted クリーンアップ処理

たとえばonMountedは「画面が表示されたあとに動かしたい処理」に使う。
APIでデータを取得したり、DOM要素の高さを取ったりする時に便利。


watchの動きと使い方

watchは、リアクティブな値(refreactiveなど)が
変化したタイミングで処理を実行したいときに使う。

基本形はこんな感じ👇

<script setup>
import { ref, watch } from 'vue'
const count = ref(0);
const message = ref('');

function countUp() {
  count.value++;
}

watch(count, (newVal, oldVal)=> {
  message.value = `countが変わった! ${newVal} → ${oldVal}`;
});
</script>

<template>
  <button @click="countUp">カウントアップ</button>
  <p>count: {{ count }}</p>
  <p>{{ message }}</p>
</template>
})

この例だと、countの値が変わるたびに
コールバックの中の処理が呼ばれます。

  • よくある使い方
    • 入力フォームの値を監視してバリデーションを走らせる
    • ルートパラメータが変わった時にAPIを再取得する
    • 条件によって別の値を更新する

watchEffectとの違い

似たようなものでwatchEffectもあるけど、
こっちは「依存してる値を自動で検知してくれる」タイプ。

<script setup>
import { ref, watchEffect } from 'vue'

const count = ref(0)
const double = ref(0)

function countUp () {
  count.value++;
}

watchEffect(() => {
  double.value = count.value * 2
})

</script>

<template>
  <p>count: {{ count }}</p>
  <p>double: {{ double }}</p>
  <button @click="countUp">増やす</button>
</template>

countを監視対象に明示しなくても、
内部で参照してるから勝手に反応してくれる。

軽く依存関係を追いたい時はwatchEffect、
しっかり対象をコントロールしたい時はwatchが向いている。

どんな時にどれを使う?

よく使うonMountedやwatchをざっくり整理すると

処理の目的 使うフック
コンポーネントの初期化 setup()
DOMを触りたい onMounted
値の変化を監視したい watch or watchEffect
クリーンアップ処理 onUnmounted

基本的に、
「一度だけ動かす」→ onMounted
「何かが変わったら動かす」→ watch

まとめ

Vueのライフサイクルやwatchは、
使い分けを意識するだけでコードがかなりスッキリする。

特にComposition APIでは「どこで動くか」を自分で管理することになるから、
このあたりを押さえておくとチーム開発でも迷わず書けるようになるかなと思います。

Discussion