Vueインスタンスのライフサイクルと各フェーズでの活用方法

Vue.jsにおけるインスタンスのライフサイクルは、生成からマウント、更新、破棄に至る一連の内部処理段階を指します。これらの段階にはそれぞれ対応するフック関数が存在し、開発者は特定のタイミングでカスタムロジックを挿入できます。

主要なライフサイクルフック

  • beforeCreate:インスタンス初期化直前。リアクティブデータやイベントリスナーは未設定。
  • created:データ観測・計算プロパティ・メソッドが利用可能。DOMはまだ存在しない。
  • beforeMount:テンプレートコンパイル完了後、実DOMへの反映直前。
  • mounted:仮想DOMが実DOMにマウント済み。this.$el経由で要素操作可能。
  • beforeUpdate:データ変更検知後、再描画前のタイミング。古いDOM状態を参照可能。
  • updated:再描画完了後。最新のDOM状態に基づく操作を実行可能。
  • beforeUnmount(※Vue3表記) / beforeDestroy:破棄直前。リソースのクリーンアップに最適。
  • unmounted(※Vue3表記) / destroyed:インスタンス完全破棄後。参照不可。

実践的なコード例

<template>
  <div class="container">
    <h2>{{ greeting }}</h2>
    <button @click="changeGreeting">挨拶を変更</button>
  </div>
</template>

<script>
export default {
  name: 'LifecycleDemo',
  data() {
    return {
      greeting: 'ようこそ Vue.js へ!'
    };
  },
  beforeCreate() {
    console.log('[初期化前] データ未定義');
  },
  created() {
    console.log('[生成後] データ初期化完了:', this.greeting);
    // API呼び出しや初期データ取得に最適
  },
  beforeMount() {
    console.log('[マウント前] テンプレート準備完了');
  },
  mounted() {
    console.log('[マウント後] DOM操作可能');
    // サードパーティライブラリの初期化やアニメーション開始
  },
  beforeUpdate() {
    console.log('[更新前] 変更前の値:', this.greeting);
  },
  updated() {
    console.log('[更新後] DOM再描画完了');
    // 更新後のDOMサイズ計測など
  },
  beforeUnmount() {
    console.log('[破棄前] クリーンアップ開始');
    // タイマー解除やイベントリスナー削除
  },
  methods: {
    changeGreeting() {
      this.greeting = 'こんにちは、世界!';
    }
  }
};
</script>

上記コードを実行すると、初回レンダリング時に以下の順序でログが出力されます:

[初期化前] データ未定義
[生成後] データ初期化完了: ようこそ Vue.js へ!
[マウント前] テンプレート準備完了
[マウント後] DOM操作可能

ボタンクリック後には追加で以下が出力されます:

[更新前] 変更前の値: ようこそ Vue.js へ!
[更新後] DOM再描画完了

明示的にインスタンスを破棄する場合は、this.$destroy()(Vue2)またはapp.unmount()(Vue3)を使用します。ただし、通常のコンポーネントでは自動管理されるため、手動破棄は特殊なユースケースに限定されます。

タグ: vue.js ライフサイクルフック コンポーネント リアクティブシステム DOM操作

7月3日 19:05 投稿