Vue 3 のライフサイクルとは?初心者向け解説

その他

はじめに

Vue 3 では、コンポーネントの ライフサイクル を理解することで、適切なタイミングで処理を実行し、効率的なアプリ開発が可能になります。本記事では、Vue のライフサイクルの概念や主要なライフサイクルフックの使い方、実践的な活用方法について解説します。

Vue のライフサイクルとは?

Vue コンポーネントのライフサイクルの概念

Vue コンポーネントは、作成から破棄までの一連の流れ(ライフサイクル)を持ちます。ライフサイクルには各フェーズごとにフック(特定の処理を実行する関数)があり、適切なタイミングでコードを実行できます。

ライフサイクルフックの役割と重要性

ライフサイクルフックを使うことで、以下のような処理を適切なタイミングで実行できます。

  • データの初期化(created/mounted)
  • API からデータを取得(onMounted)
  • データ変更時の処理(onUpdated)
  • イベントリスナーの解除(onUnmounted)

Vue 2 と Vue 3 のライフサイクルの違い

Vue 2 では created()mounted() などの オプション API を使用しましたが、Vue 3 では Composition APIonMounted() などを使用します。

Vue 2 のライフサイクルフック(オプション API)

export default {
  created() {
    console.log('コンポーネントが作成されました');
  },
  mounted() {
    console.log('コンポーネントがDOMに描画されました');
  }
};

Vue 3 のライフサイクルフック(Composition API)

<script setup>
import { onMounted } from 'vue';

onMounted(() => {
  console.log('コンポーネントがDOMに描画されました');
});
</script>

Composition API では setup() 内で onMounted() などのフックを使う形になります。

主要なライフサイクルフックの解説

created(コンポーネント作成時)

  • データの初期化 に使用
  • DOM にはまだアクセスできない

Vue 2 の例

export default {
  created() {
    console.log('コンポーネントが作成されました');
  }
};

Vue 3 の例(Composition API では不要)

Composition API では onMounted() を使うのが一般的です。

mounted(DOM 描画完了後)

  • DOM が利用可能になる
  • API からデータを取得する処理 などに適用

Vue 2 の例

export default {
  mounted() {
    console.log('コンポーネントがDOMに描画されました');
  }
};

Vue 3 の例

<script setup>
import { onMounted } from 'vue';

onMounted(() => {
  console.log('コンポーネントがDOMに描画されました');
});
</script>

updated(データ変更時)

  • データが変更され、DOM が更新されるたびに実行

Vue 2 の例

export default {
  data() {
    return {
      count: 0
    };
  },
  updated() {
    console.log(`count が ${this.count} に更新されました`);
  }
};

Vue 3 の例

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

const count = ref(0);

onUpdated(() => {
  console.log(`count が ${count.value} に更新されました`);
});
</script>

beforeUnmount / unmounted(コンポーネント破棄時)

  • beforeUnmount: 削除前の処理
  • unmounted: 削除後の処理
  • イベントリスナーやタイマーの解除 に使用

Vue 2の例

export default {
  data() {
    return {
      intervalId: null
    };
  },
  mounted() {
    this.intervalId = setInterval(() => {
      console.log('タイマー実行中');
    }, 1000);
  },
  beforeDestroy() {
    clearInterval(this.intervalId);
    console.log('コンポーネントが削除される前にタイマーを解除しました');
  },
  destroyed() {
    console.log('コンポーネントが破棄されました');
  }
};

Vue 3 の例

<script setup>
import { onBeforeUnmount } from 'vue';

let intervalId = setInterval(() => {
  console.log('タイマー実行中');
}, 1000);

onBeforeUnmount(() => {
  clearInterval(intervalId);
  console.log('コンポーネントが削除される前にタイマーを解除しました');
});
</script>
<script setup>
import { onUnmounted } from 'vue';

const cleanup = () => {
  console.log('コンポーネントが破棄されました');
};

onUnmounted(cleanup);
</script>

Composition API でのライフサイクルの書き方

onMounted(), onUpdated(), onUnmounted() の使い方

Vue 3 では setup() 内で以下のようにライフサイクルフックを使用します。

<script setup>
import { ref, onMounted, onUpdated, onUnmounted } from 'vue';

const message = ref('初期メッセージ');

onMounted(() => {
  console.log('コンポーネントがマウントされました');
});

onUpdated(() => {
  console.log('データが変更されました');
});

onUnmounted(() => {
  console.log('コンポーネントが破棄されました');
});
</script>

ライフサイクルフックの実践例

onMounted() を使って API からデータを取得する

<script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';

const data = ref(null);

onMounted(async () => {
  const response = await axios.get('https://jsonplaceholder.typicode.com/posts/1');
  data.value = response.data;
});
</script>

onUpdated() を使ってデータ変更時にログを出力する

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

const count = ref(0);

onUpdated(() => {
  console.log(`カウントが ${count.value} に更新されました`);
});
</script>

onUnmounted() を使って不要なイベントリスナーを解除する

<script setup>
import { onUnmounted } from 'vue';

const handleResize = () => {
  console.log('ウィンドウサイズが変更されました');
};

window.addEventListener('resize', handleResize);

onUnmounted(() => {
  window.removeEventListener('resize', handleResize);
});
</script>

5. Vue のライフサイクルを活用するためのポイント

  • onMounted() で API 通信を行う理由: DOM が確実に存在するタイミングでデータを取得するため
  • beforeUnmount() でクリーンアップ処理を適切に実装: 不要なリスナーやタイマーを解除
  • ベストプラクティス: Composition API の onMounted() を活用し、クリーンなコードを維持する

Vue 3 のライフサイクルを理解し、適切に活用することで、より効率的なアプリ開発を目指しましょう!

コメント

タイトルとURLをコピーしました