Vue.js v-if, v-else, v-else-if の使い方徹底解説:条件付きレンダリングをマスターする
Vue.jsを使ったフロントエンド開発において、ユーザーインターフェース(UI)は常に同じ形をしているわけではありません。ユーザーの操作、データの状態、アプリケーションの状況などに応じて、表示する要素を動的に切り替える必要があります。例えば、ログイン状態によって表示するメニューを変えたり、データの読み込み中にローディング表示をしたり、特定の条件を満たした場合にだけエラーメッセージを表示したりといったケースです。
このような、特定の「条件」に基づいてHTML要素をレンダリングするかどうかを制御する仕組みを、条件付きレンダリング (Conditional Rendering) と呼びます。Vue.jsでは、この条件付きレンダリングを実現するための主要なディレクティブとして、v-if
、v-else
、v-else-if
が提供されています。これらのディレクティブを理解し、適切に使いこなすことは、Vue.jsアプリケーションを効率的かつ柔軟に構築する上で非常に重要です。
この記事では、Vue.jsの v-if
、v-else
、v-else-if
について、それぞれの基本的な使い方から、内部的な仕組み、v-show
との違い、パフォーマンスに関する考慮事項、そして実践的な応用例まで、徹底的に解説します。この記事を読めば、Vue.jsにおける条件付きレンダリングをマスターし、よりリッチでインタラクティブなUIを構築できるようになるでしょう。
1. なぜ条件付きレンダリングが必要なのか?
現代のウェブアプリケーションは、静的なコンテンツだけでなく、ユーザーの入力やバックエンドからのデータに基づいて動的に変化するUIを持つことが一般的です。条件付きレンダリングは、このような動的なUIを実現するための基本的な要素技術です。
考えられるユースケースは無数にあります。
- データの有無: APIからデータを取得する際に、データがまだロード中であればローディングスピナーを表示し、データが取得できたらその内容を表示する。データが取得できなかった場合は「データがありません」といったメッセージを表示する。
- ユーザー認証・権限: ユーザーがログインしているか、管理者権限を持っているかなどによって、表示するメニュー項目や操作可能なボタンを切り替える。
- アプリケーションの状態: フォームの入力が有効か無効かによって、送信ボタンを有効/無効にする。特定のモード(編集モード、閲覧モードなど)によって表示するUIを変える。
- エラーハンドリング: バリデーションエラーやサーバーエラーが発生した場合に、ユーザーにエラーメッセージを表示する。
- モーダルウィンドウやドロップダウン: 特定のイベント(ボタンクリックなど)が発生したときにだけ、オーバーレイやメニューを表示する。
これらのケースでは、条件を満たさない要素はDOMツリーに存在すらさせたくない場合や、単に非表示にしたい場合があります。Vue.jsの条件付きレンダリングディレクティブは、これらの要求に応えるための強力なツールです。
2. v-if
ディレクティブ:条件が真の場合に要素をレンダリング
v-if
は、最も基本的な条件付きレンダリングディレクティブです。指定した条件式が真 (truthy) と評価された場合にのみ、要素とそれ以下の子要素をレンダリングします。条件式が偽 (falsy) と評価された場合、その要素はDOMから完全に削除されます。
2.1. 基本的な使い方
v-if
ディレクティブは、HTML要素に属性として追加します。属性値には、JavaScriptの式を指定します。この式が真と評価されれば要素が表示され、偽と評価されれば要素は表示されません。
“`html
この段落は isVisible が真の場合に表示されます。
“`
この例では、isVisible
というデータプロパティの値が true
なので、「この段落は isVisible が真の場合に表示されます。」というテキストを含む <p>
要素がレンダリングされます。もし isVisible
が false
であれば、その <p>
要素はDOMに存在しません。
2.2. v-if
の条件式
v-if
の属性値には、JavaScriptで真偽値として評価できるあらゆる式を使用できます。
- 真偽値 (Boolean):
true
またはfalse
- Truthiness/Falsiness: JavaScriptでは、多くの値が真偽値に変換されて評価されます。例えば、数値の
0
、空文字列""
、null
、undefined
、NaN
は falsy と評価されます。それ以外の文字列、0
以外の数値、オブジェクト、配列などは truthy と評価されます。
html
<p v-if="message.length > 0">メッセージがあります。</p> <!-- messageが空文字列でなければ表示 -->
<p v-if="users.length">ユーザーが {{ users.length }} 人います。</p> <!-- users配列が空でなければ表示 -->
<p v-if="user">ユーザー情報がロードされました。</p> <!-- userオブジェクトがnullやundefinedでなければ表示 -->
<p v-if="count">{{ count }} 件です。</p> <!-- countが0でなければ表示 --> - 比較演算子:
>
、<
、===
、!==
などを使った比較式。
html
<button v-if="age >= 18">成人です</button> - 論理演算子:
&&
(AND),||
(OR),!
(NOT) を使った複合条件。
html
<div v-if="isAuthenticated && userRole === 'admin'">管理者用コンテンツ</div>
<button v-if="!isLoading">送信</button> - メソッド呼び出し: メソッドを呼び出し、その戻り値の真偽値によって表示を切り替えることも可能です。ただし、テンプレート内で複雑なロジックを持つメソッドを呼び出すと可読性が低下したり、パフォーマンスに影響を与える可能性があるため、複雑な条件は計算プロパティ (computed properties) で定義することが推奨されます。
2.3. v-if
の仕組み:DOMの破棄と再構築
v-if
の最も重要な特徴は、条件が偽の場合に要素をDOMから完全に削除する点です。そして、条件が真に変わった時に改めてDOM要素を作成し、挿入します。
この仕組みは、以下のような影響を与えます。
- コスト: 条件が頻繁に切り替わる場合、要素の破棄と再構築のコストが発生します。一方、あまり切り替わらない要素に対しては、DOMに存在しないため初期レンダリングのパフォーマンスが良い可能性があります。
- ライフサイクルフック: 条件が真になって要素がDOMに挿入されると、その要素を持つコンポーネントの
mounted
フックが呼び出されます。条件が偽になって要素がDOMから削除されると、その要素を持つコンポーネントのunmounted
フック(Vue 2ではdestroyed
)が呼び出されます。 - 状態のリセット: 要素が破棄されるため、その要素(および子孫要素)が持っていた内部的な状態(例えば、
<input>
要素の入力値や、子コンポーネントのデータなど)は全て失われます。条件が真に戻って要素が再構築される際には、初期状態からレンダリングされます。
この特性から、v-if
は以下のような場面で適しています。
- 存在しないデータを表示しない: データがロードされるまで要素自体をDOMに表示させたくない場合。
- ユーザー権限など、めったに変わらない条件: 条件が頻繁に切り替わらない場合、DOM操作のオーバーヘッドは気になりにくい。
- 要素の状態をリセットしたい: 条件が偽から真に変わったときに、要素の状態を初期状態に戻したい場合。
- コンポーネントの初期化・破棄が必要:
mounted
やunmounted
フックで特定の処理を行いたいコンポーネントの表示/非表示。
2.4. v-if
の実践的な例
例1:ログイン状態による表示切り替え
“`html
ユーザー情報
ログインユーザー: {{ username }}
ログインしていません。
“`
ここでは、isLoggedIn
の値によって、ログイン状態用のUIと非ログイン状態用のUIが切り替わります。isLoggedIn
が false
の場合、ログインユーザー情報を表示する div
はDOMに存在しません。
例2:データのロード中表示
“`html
データをロード中です…
データのロードに失敗しました: {{ error }}
ユーザーリスト
- {{ user.name }}
ユーザーはいません。
“`
この例では、isLoading
、error
、users
の状態に応じて、ロード中、エラー表示、またはユーザーリスト表示が切り替わります。v-if
、v-else-if
、v-else
が連携して使われています。また、ユーザーリストが空の場合に「ユーザーはいません。」と表示するために、リスト表示divの中にさらに v-if
が使われています。
3. v-else
ディレクティブ:v-if
や v-else-if
の代替表示
v-else
ディレクティブは、直前の v-if
または v-else-if
の条件が全て偽 (falsy) と評価された場合にのみ、要素をレンダリングします。
3.1. 基本的な使い方
v-else
は単独では機能しません。必ず、v-if
または v-else-if
の直後にある要素に使用します。
“`html
ようこそ、{{ username }}さん!
ゲストさん、ログインしてください。
“`
この例では、isLoggedIn
が true
なら最初の div
が表示され、false
なら v-else
の付いた2番目の div
が表示されます。
3.2. v-else
の仕組み
v-else
は、直前の v-if
または v-else-if
の条件が偽になったときに、対応する要素をレンダリングします。これは、JavaScriptの if (...) { ... } else { ... }
の構造と全く同じロジックをテンプレート上で実現します。
重要なのは、v-else
が機能するためには、その要素がVueのテンプレートコンパイラによって直前の v-if
または v-else-if
とペアであると認識される必要がある点です。そのため、間に他の要素(コメントや空白行を除く)を挟むことはできません。
“`html
間に挟まった要素
“`
3.3. v-else
のユースケース
v-else
は、単純な二者択一の条件分岐(AかBか)を実現するのに最適です。
- 真/偽: 条件が真の場合と偽の場合で表示を完全に切り替えたい。
- データあり/データなし: データの有無によって表示内容を変える。
- 操作可能/操作不可: ユーザーが特定の操作を行えるか行えないかによって、表示する要素を変える。
例:検索結果の表示/非表示
“`html
検索結果が見つかりませんでした。
“`
この例では、searchResults
配列の長さが0より大きいかどうかで、検索結果リストを表示するか、「検索結果が見つかりませんでした。」というメッセージを表示するかが切り替わります。
4. v-else-if
ディレクティブ:複数の条件分岐
v-else-if
ディレクティブは、v-if
の後に続く追加の条件を指定する場合に使用します。これは、JavaScriptの if (...) { ... } else if (...) { ... }
の構造をテンプレートで実現するものです。
4.1. 基本的な使い方
v-else-if
は、v-if
または他の v-else-if
の後に続き、v-else
の前に配置します。複数の v-else-if
を連ねることも可能です。
“`html
注文は保留中です。
注文を処理中です…
注文は発送されました!
注文ステータス不明。
“`
この例では、status
の値に応じて4種類のメッセージのうち1つだけが表示されます。status
が ‘pending’ なら最初の div
が、’processing’ なら2番目の div
が、’shipped’ なら3番目の div
が表示されます。いずれにも該当しない場合は、v-else
の付いた最後の div
が表示されます。
4.2. v-else-if
の仕組み
v-else-if
は、上から順番に条件を評価します。最初に真 (truthy) と評価された条件に対応する要素だけがレンダリングされ、それ以降の v-else-if
および v-else
の条件は評価されません。
これも v-if
と同様に、条件が真になった要素以外はDOMから完全に削除されます。v-else
と同様に、直前の v-if
や v-else-if
要素の直後に配置する必要があります。
4.3. v-else-if
のユースケース
v-else-if
は、複数の排他的な条件に基づいて表示を切り替えたい場合に非常に役立ちます。
- ステータスや状態: オブジェクトの状態(例えば、注文ステータス、タスクの状態、ユーザーのオンライン状態など)が複数の可能性を持つ場合に、それぞれの状態に応じた表示を行う。
- 段階的な条件: ある条件が満たされなかった場合に、次の条件を評価するといった優先順位のある分岐。
- 入力値の範囲: 入力値が特定の範囲(例: 0-10, 11-20, 21-30)に応じて異なるメッセージを表示する。
例:ユーザーの役割によるUI切り替え
“`html
ようこそ!
あなたは管理者です。全ての機能にアクセスできます。
あなたは編集者です。コンテンツの編集が可能です。
あなたはモデレーターです。コメントの管理が可能です。
あなたは一般ユーザーです。
“`
この例では、userRole
というデータプロパティの値に基づいて、異なる役割を持つユーザーにそれぞれに応じたUIブロックが表示されます。最も権限の高い ‘admin’ から順に条件を評価していくことで、適切なUIが表示されます。
5. v-if
ファミリーのグループ化と <template>
タグ
v-if
、v-else-if
、v-else
は単一の要素に適用されます。では、複数の要素をまとめて条件付きで表示したい場合はどうすれば良いでしょうか? 例えば、条件が真の場合に、見出しと段落のセットを表示したい場合などです。
このような場合に便利なのが、<template>
タグです。<template>
タグは、それ自体はDOMにレンダリングされませんが、複数の要素をグループ化するために使用できます。v-if
ファミリーディレクティブを <template>
タグに適用することで、子要素全体に対して条件付きレンダリングを行うことができます。
“`html
見出し
ここにコンテンツが入ります。
コンテンツは表示されていません。
“`
この例では、showContent
が true
の場合、<h2>
、<p>
、<button>
の3つの要素がまとめてレンダリングされます。showContent
が false
の場合は、これらの3つの要素はDOMから完全に削除され、代わりに v-else
の付いた <p>
要素が表示されます。
<template>
タグを使うメリットは、不要なラッパー要素(例えば div
など)を生成せずに複数の要素をグループ化できる点です。これにより、HTML構造がよりセマンティックになり、CSSのスタイルにも影響を与えにくくなります。
6. v-if
と v-show
の違いと使い分け
Vue.jsには、条件付きレンダリングのためのもう一つのディレクティブ、v-show
があります。v-if
ファミリーと同様に要素の表示/非表示を制御しますが、その内部的な仕組みが大きく異なります。この違いを理解することが、適切なディレクティブを選択する上で非常に重要です。
6.1. 仕組みの違い
-
v-if
:- 条件が偽の場合、要素はDOMから完全に削除されます。
- 条件が真の場合、要素はDOMに作成され挿入されます。
- DOM操作: 要素の破棄と再構築を伴います。
-
v-show
:- 条件が偽の場合、要素はDOMに残りますが、CSSの
display: none;
スタイルが適用されて非表示になります。 - 条件が真の場合、
display: none;
スタイルが解除されて表示されます。 - DOM操作: 初期レンダリング時(または条件が初めて真になった時)に要素を作成する以外は、DOM構造自体は変化しません。表示/非表示はスタイルの切り替えで行われます。
- 条件が偽の場合、要素はDOMに残りますが、CSSの
6.2. コストとパフォーマンス
この仕組みの違いは、パフォーマンス特性に影響します。
-
v-if
:- 初期レンダリング: 条件が最初から偽の場合、要素が作成されないため初期レンダリングの負荷は低くなります。ただし、条件が真で複雑な要素をレンダリングする場合は、その構築コストが発生します。
- 切り替え: 条件が切り替わるたびにDOMの破棄と再構築が発生するため、切り替えコストは比較的高くなります。
-
v-show
:- 初期レンダリング: 条件に関わらず要素はDOMに作成されるため、初期レンダリングの負荷は
v-if
よりも高くなる可能性があります(非表示の要素も作成されるため)。 - 切り替え: スタイルの切り替えのみであるため、切り替えコストは非常に低いです。
- 初期レンダリング: 条件に関わらず要素はDOMに作成されるため、初期レンダリングの負荷は
6.3. 使い分けの基準
上記の仕組みとコストの違いに基づき、以下のように使い分けることが推奨されます。
-
v-if
を使うべき場面:- 条件がめったに切り替わらない: DOM操作のコストが問題になりにくい。
- 初期表示でほとんどの場合に要素が表示されない: DOMに存在しない方が効率的。
- 要素が存在しないことがセマンティックに正しい: 例: ユーザーがログインしていない場合に「ログアウト」ボタンが存在しないのは自然。
- 条件が偽になった時に要素の状態をリセットしたい: DOMから削除されることで自動的に状態が初期化される。
- 子コンポーネントのライフサイクルフック(
mounted
,unmounted
)を利用したい:v-if
はこれらのフックをトリガーする。
-
v-show
を使うべき場面:- 条件が頻繁に切り替わる: タブの切り替え、ドロップダウンメニューの開閉など、要素の表示/非表示が繰り返し行われる場合、スタイルの切り替えの方が効率的。
- 初期表示で要素が表示される可能性が高い、または常にDOMに存在してほしい: 非表示であっても要素がDOMにあるため、表示への切り替えが高速。
- 要素が存在しないことがセマンティックにおかしくない: 例: モーダルウィンドウが非表示になっているだけでDOMには存在している。
例:頻繁な切り替え(タブUI)
“`html
タブ1の内容
ここにタブ1のコンテンツが入ります。
タブ2の内容
ここにタブ2のコンテンツが入ります。
タブ3の内容
ここにタブ3のコンテンツが入ります。
“`
この例では、ユーザーがタブボタンをクリックするたびに activeTab
が切り替わります。これにより、各タブの内容を含む div
の v-show
条件が真偽を反転させ、スタイルによって表示/非表示が切り替わります。タブの切り替えは頻繁に行われるため、v-show
が適しています。もし v-if
を使うと、タブを切り替えるたびに古いタブの内容がDOMから削除され、新しいタブの内容がDOMに作成されるというDOM操作が発生し、パフォーマンスが低下する可能性があります。
6.4. まとめ:v-if
vs v-show
比較表
特徴 | v-if |
v-show |
---|---|---|
仕組み | 条件が偽の場合、要素をDOMから破棄する。 | 条件が偽の場合、display: none; を適用する。 |
DOM構造 | 条件が偽の間はDOMに存在しない。 | 条件に関わらずDOMに存在する。 |
初期コスト | 条件が偽なら低い。真なら要素構築コスト発生。 | 条件に関わらず要素構築コスト発生。 |
切り替えコスト | 高い(DOM操作)。 | 低い(スタイル変更)。 |
適した場面 | 切り替え頻度が低い。条件が偽でほとんど表示されない。要素が存在しない方が望ましい。 | 切り替え頻度が高い。初期からDOMに存在してほしい。 |
ライフサイクルフック | mounted , unmounted をトリガーする。 |
トリガーしない。 |
7. 注意点とベストプラクティス
v-if
ファミリーや v-show
を効果的に使うためには、いくつかの注意点とベストプラクティスがあります。
7.1. v-if
と v-for
の同時使用
これはよくある間違いや混乱の元となるパターンです。一つの要素に v-if
と v-for
を同時に適用した場合、Vueのバージョンによって挙動が異なり、推奨されない場合があります。
- Vue 2.x:
v-for
がv-if
よりも優先されます。つまり、まずリスト全体がループされて要素が作成され、その後各要素に対してv-if
が評価されます。これは非効率的で、意図しない結果を招く可能性があります。
html
<!-- Vue 2.x での挙動 (非推奨) -->
<!-- 全てのitemに対して<li>が作成され、その後conditionが評価されて表示/非表示が決まる -->
<ul>
<li v-for="item in items" v-if="item.condition">{{ item.name }}</li>
</ul> - Vue 3.x:
v-if
がv-for
よりも優先されます。つまり、まずv-if
の条件が評価され、その結果が真の場合にのみv-for
が実行されます。これはVue 2.x より直感的ですが、それでも推奨される方法ではありません。
html
<!-- Vue 3.x での挙動 -->
<!-- condition が真の場合にのみ、items リストに対して <li> 要素がループされて作成される -->
<ul>
<li v-for="item in items" v-if="condition">{{ item.name }}</li>
</ul>
推奨される方法:
<template>
タグを使ってv-if
を外側で囲む: これはVueの公式ドキュメントでも推奨されている方法です。まずv-if
でリスト全体を表示するかどうかを判断し、表示する場合にのみ<template>
の中でv-for
を使って要素をループさせます。
html
<ul>
<template v-if="items.length > 0">
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</template>
<li v-else>リストは空です。</li>
</ul>
この例では、items
配列が空でない場合にのみ<template>
ブロックがレンダリングされ、その中でv-for
が実行されます。-
計算プロパティ (
computed
) でリストをフィルタリングする: これは最も柔軟で効率的な方法です。表示したい要素だけをフィルタリングした新しいリストを計算プロパティで作成し、そのリストに対してv-for
を実行します。
“`html
- {{ item.name }}
表示するアイテムがありません。
``
v-for` が実行されるため、パフォーマンスも向上します。
この方法のメリットは、テンプレートがシンプルになり、条件ロジックをJavaScript側(計算プロパティ内)に分離できる点です。また、フィルタリングされたリストに対してのみ
7.2. 複雑な条件は計算プロパティを使う
v-if
や v-else-if
の条件式が複雑になる場合(複数の条件を論理演算子で組み合わせたり、長い式になったり)、テンプレートの可読性が著しく低下します。このような場合は、複雑なロジックを計算プロパティとして定義し、テンプレートではその計算プロパティを参照するようにしましょう。
“`html
“`
計算プロパティを使うことで、テンプレートはシンプルになり、条件の意味が canShowAdminButton
という名前からすぐに理解できるようになります。また、同じ条件を複数の場所で使う場合にも、計算プロパティを再利用できるため効率的です。
7.3. ネストされた条件付きレンダリングの管理
条件付きレンダリングを複数段階でネストする場合、テンプレートが深くネストされて読みにくくなることがあります。
“`html
“`
このような構造が複雑になりすぎる場合は、コンポーネントに分割することを検討しましょう。例えば、管理者用のUI、編集者用のUIなどをそれぞれ別のコンポーネント (AdminDashboard.vue
, EditorPanel.vue
) として定義し、親コンポーネントでは条件に基づいて適切なコンポーネントをレンダリングします。
“`html
“`
これにより、各コンポーネントのテンプレートはシンプルになり、全体の見通しが良くなります。
7.4. キー属性 (key
) の重要性
v-for
を使う際には、リストの各要素に対して一意の key
属性を指定することが非常に重要です。これは、Vueがリストの変更を効率的に検知し、差分を適用(DOMを更新)する際に、既存の要素を再利用したり並び替えたりするために必要です。
v-if
ファミリーディレクティブ自体は通常 key
を必要としません。なぜなら、条件によって要素全体が破棄されるか作成されるかのどちらかだからです。しかし、v-if
や v-else-if
を使って要素タイプが同じものを条件によって切り替える場合、Vueはデフォルトで可能な限り要素を再利用しようとします。これにより、例えば <input>
要素の値などが予期せず引き継がれてしまうことがあります。このような挙動を避け、条件が切り替わったときに完全に新しい要素として作成し直したい場合は、明示的に異なる key
を指定することが有効です。
“`html
``
loginType
この例では、によって表示する
のラベルとタイプが変わりますが、どちらも
要素です。ユーザーがユーザー名入力欄に何か入力した状態でメールアドレス入力に切り替えた際に、
keyが指定されていないと同じ
要素が再利用され、入力値が引き継がれる可能性があります。異なる
key(
username-inputと
email-input) を指定することで、Vueはこれらを別の要素として扱い、切り替え時に完全に新しい
` 要素を作成します。これにより、前の入力値は引き継がれません。
ただし、これは特定の状況下での高度なテクニックであり、ほとんどの場合は v-if
ファミリーに明示的に key
を指定する必要はありません。主に v-for
を使う際に key
が重要であることを覚えておきましょう。
8. 応用例
v-if
ファミリーは、単に要素の表示/非表示を切り替えるだけでなく、他のVue.jsの機能と組み合わせて使うことで、さらにパワフルなUIを実現できます。
8.1. 動的コンポーネントと v-if
<component :is="componentName">
構文を使うと、データプロパティの値に応じて動的に表示するコンポーネントを切り替えることができます。これは v-if
ファミリーと似ていますが、特定のコンポーネントを条件付きで表示したい場合に特に便利です。
“`html
“`
この例では、currentComponent
の値によって ComponentA
または ComponentB
が表示されます。ここで v-if="currentComponent"
を併用することで、currentComponent
が空文字列などの falsy な値の場合はコンポーネント自体がレンダリングされないようにできます(v-show
も同様に使えますが、動的コンポーネントは v-if
と組み合わせることが多いです)。
8.2. トランジション (<transition>
) と v-if
v-if
を使用して要素がDOMに出入りする際に、アニメーションを適用したい場合があります。Vue.jsは、このような要素の表示/非表示やリストの変更に対してトランジション(アニメーション)を簡単に適用するための <transition>
ラッパーコンポーネントを提供しています。
v-if
(および v-show
)で切り替えられる要素を <transition>
タグで囲むだけで、表示時 (enter
) と非表示時 (leave
) のアニメーションを指定できるようになります。
“`html
アニメーション付きで表示/非表示
“`
この例では、ボタンをクリックして show
の値を切り替えると、<p>
要素がフェードイン/フェードアウトします。<transition name="fade">
は、v-if="show"
で管理される要素のDOMへの挿入/削除を検知し、指定された名前 (fade
) に基づくCSSクラス(例: fade-enter
, fade-enter-active
, fade-leave-to
, fade-leave-active
など)を適用することでアニメーションを実現します。
v-if
は要素のDOM操作を伴うため、<transition>
と非常に相性が良いです。v-show
も <transition>
と組み合わせて使えますが、その場合はスタイルの切り替えに対してアニメーションが適用されます。
9. まとめ
この記事では、Vue.jsの条件付きレンダリングを実現する主要なディレクティブである v-if
、v-else
、v-else-if
について、その基本的な使い方から詳細な仕組み、そして v-show
との使い分けまでを網羅的に解説しました。
v-if
は条件が真の場合に要素をレンダリングし、偽の場合はDOMから完全に削除します。条件式には真偽値として評価できるあらゆるJavaScriptの式が使えます。v-else
は直前のv-if
またはv-else-if
の条件が全て偽の場合にレンダリングされ、単独では機能しません。v-else-if
はv-if
の後に続く追加の条件を指定し、複数の排他的な分岐を実現します。上から順に評価され、最初に真になった条件の要素だけがレンダリングされます。- 複数の要素をまとめて条件付きレンダリングしたい場合は、不要なラッパー要素を作らない
<template>
タグにv-if
ファミリーディレクティブを適用します。 v-if
とv-show
はどちらも条件付きレンダリングを行いますが、v-if
はDOMの破棄/再構築、v-show
はスタイルの切り替えによって実現します。切り替え頻度や初期表示の要件によって適切な方を選択することが重要です。v-if
とv-for
の同時使用は推奨されません。代わりに<template>
でv-if
を囲むか、計算プロパティでリストをフィルタリングしてからv-for
を使うようにしましょう。- 複雑な条件式は、テンプレートの可読性を高めるために計算プロパティとして定義することがベストプラクティスです。
- ネストされた条件が複雑になる場合は、コンポーネントに分割して管理することでコードを整理できます。
v-if
は、動的コンポーネント (<component :is="...">
) やトランジション (<transition>
) と組み合わせて使うことで、より高度なUIを実現できます。
条件付きレンダリングは、Vue.jsアプリケーションのUIを動的でリアクティブにするための基盤となる技術です。これらのディレクティブの特性をしっかりと理解し、それぞれの用途に応じて適切に使い分けることで、保守性が高く、パフォーマンスにも優れたVue.jsアプリケーションを開発できるようになるでしょう。
この記事が、あなたのVue.js開発の一助となれば幸いです。さらに深く学びたい場合は、Vue.jsの公式ドキュメントを参照することをおすすめします。