0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Vue.js Composition API

0
Last updated at Posted at 2026-07-07

Composition API はVue.js 3で本格導入され、現在の開発の標準となっています。従来のOptions API(datamethodsに分ける記述方法)と比較しながら、そのメリットとデメリットを整理しました。

Composition APIとは

Composition APIは、コンポーネントのロジックを柔軟に「組み立てる(Compose)」ための記述スタイルです。

Options APIが「オブジェクトの構造(Vue独自のルール)」に従ってコードを記述していたのに対し、Composition APIは「機能(関心の対象)」ごとにコードをまとめて整理できるのが特徴です。

Options APIとComposition APIのコード比較

同じ機能(カウントアップとメッセージ入力・クリア)を持つコンポーネントの記述例です。

1. Options API

<template>
  <div>
    <p>カウント: {{ count }} / 倍数: {{ doubleCount }}</p>
    <button @click="increment">+1</button>
    <input v-model="message" type="text" />
    <button @click="clearMessage">クリア</button>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
  data() {
    return {
      count: 0,
      message: ''
    }
  },
  computed: {
    doubleCount(): number {
      return this.count * 2
    }
  },
  methods: {
    increment() {
      this.count++
    },
    clearMessage() {
      this.message = ''
    }
  }
})
</script>

2. Composition API(<script setup>)

<template>
  <div>
    <p>カウント: {{ count }} / 倍数: {{ doubleCount }}</p>
    <button @click="increment">+1</button>
    <input v-model="message" type="text" />
    <button @click="clearMessage">クリア</button>
  </div>
</template>

<script lang="ts" setup>
import { ref, computed } from 'vue'

// カウント機能
const count = ref(0)
const doubleCount = computed(() => count.value * 2)
const increment = () => {
  count.value++
}

// メッセージ機能
const message = ref('')
const clearMessage = () => {
  message.value = ''
}
</script>

主な違い

  • this の撤廃this.count などの記述が不要になり、純粋なJavaScriptの変数・関数としてスコープ内で完結します。
  • 関心の対象による分割:機能ごとに変数や関数を近くに配置できるため、コードの縦移動(スクロール)が減ります。
  • ボイラープレートの削減export default やリターン文などの定型コードが最小限になります。

Composition APIのメリット

1. 純粋なJavaScript/TypeScriptに近い感覚で書ける

Vue特有のオブジェクト構造や this の挙動に依存しないため、一般的なJS/TSの知識をそのまま活かして直感的に記述できます。

2. コードを機能ごとにまとめられる

コンポーネントが肥大化しても、同じ機能に関するロジックが分散しないため、コードの可読性とメンテナンス性が向上します。

3. TypeScriptとの親和性

プレーンな関数と変数で構成されるため、特別な設定や記述をしなくても、TypeScriptの型推論の恩恵を受け、IDE等の強力なサポートを得られます。

Composition APIのデメリットと注意点

基本的にはComposition APIの利用が推奨されますが、Options APIからの移行にあたっては以下に注意が必要です。

1. 自由度の高さによるコードの散らかり

記述の自由度が高いため、プロジェクト内でルールや切り出し基準を定めておかないと、1つのファイル内に乱雑なコードが量産される原因になります。

2. リアクティブシステム(ref / reactive)の理解コスト

値を画面と連動させるためにラッパー関数(ref など)を使用する必要があります。JavaScript側からアクセスする際、.value の付け忘れが発生しやすいといった特有のルールに慣れが必要です。

公式による推奨

Vue.js公式ドキュメントでは、本番環境や中大規模のアプリケーション、およびNuxtなどのフルスタックフレームワークを利用する場合において、Composition APIと <script setup> の組み合わせを推奨しています。理由として以下の点が挙げられています。

  • 本番環境でのパフォーマンス向上(プロキシを経由しないためメモリ効率と実行速度が最適化される)
  • ソースコード量の削減
  • エコシステム(Nuxt 3やPiniaなど)との整合性

まとめ

Options APIも引き続きサポートされてはいますが、現在のエコシステムやTypeScriptとの親和性を考慮すると、今後はComposition APIの採用が推奨されます。まだ移行していないプロジェクトについては移行を検討し、新規開発のプロジェクトにおいては原則Composition APIを採用すべきでしょう。

Composition API FAQ https://ja.vuejs.org/guide/extras/composition-api-faq

<script setup> https://ja.vuejs.org/api/sfc-script-setup

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?