Vue.jsにおける**条件付きレンダリング(v-if、v-else、v-show)と繰り返しレンダリング(v-for)**は、動的なデータに基づいてUIを変更するための非常に重要な機能です。これらのディレクティブを理解し、適切に使用することで、効率的で応答性の高いアプリケーションを構築できます。本記事では、これらのディレクティブの基本的な使い方から、実際の開発における応用方法までを詳しく解説します。
1. 条件付きレンダリング (Conditional Rendering)
条件付きレンダリングは、特定の条件に基づいてDOM要素を動的に表示または非表示にするために使用されます。Vue.jsでは、主にv-if
、v-else
、v-show
の3つのディレクティブが提供されています。

1.1 v-if
v-if
ディレクティブは、条件が真の場合にのみ要素をレンダリングします。条件が偽の場合、その要素はDOMに一切存在しません。
html<div id="app">
<p v-if="isVisible">このテキストは条件が真の場合のみ表示されます。p>
<button @click="toggleVisibility">表示/非表示を切り替えbutton>
div>
<script>
new Vue({
el: '#app',
data: {
isVisible: true
},
methods: {
toggleVisibility() {
this.isVisible = !this.isVisible;
}
}
});
script>
この例では、isVisible
がtrue
の場合にのみ
タグが表示されます。v-if
は条件が変更されるたびにDOMの再レンダリングを行います。
1.2 v-else
v-else
は、v-if
またはv-show
とセットで使います。v-if
がfalse
の場合に、v-else
に指定された要素が表示されます。
html<p v-if="isVisible">このテキストは表示されます。p>
<p v-else>このテキストは非表示の場合に表示されます。p>
v-else
は、必ず直前のv-if
またはv-show
と隣接していなければならない点に注意してください。
1.3 v-show
v-show
は、v-if
と似た動作をしますが、内部的には要素の表示/非表示をCSSのdisplay
プロパティで制御します。要素は常にDOMに存在しますが、display: none;
を使って非表示にされます。
html<p v-show="isVisible">このテキストは条件に基づいて表示/非表示になります。p>
v-show
はv-if
よりもパフォーマンスが良い場合がありますが、要素が常にDOMに残るため、大量の要素を非表示にしたい場合はv-if
の方が効率的です。
2. 繰り返しレンダリング (List Rendering)
Vue.jsでは、配列やオブジェクトを繰り返しレンダリングするためにv-for
ディレクティブを使用します。このディレクティブは、リストやオブジェクトの各アイテムに対して繰り返し要素を生成します。
2.1 v-forを使った配列のレンダリング
v-for
は、配列やオブジェクトをループして、各アイテムに対して要素を繰り返し生成します。
html<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}li>
ul>
<script>
new Vue({
el: '#app',
data: {
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Cherry' }
]
}
});
script>
上記の例では、items
配列の各アイテムについて
v-for
を使用する際には、key
属性を指定することが推奨されます。これにより、Vueは各要素の再レンダリングを最適化できます。
2.2 v-forを使ったオブジェクトのレンダリング
オブジェクトを繰り返す場合も、v-for
を使用できます。オブジェクトのキーと値にアクセスすることができます。
html<ul>
<li v-for="(value, key) in fruit" :key="key">{{ key }}: {{ value }}li>
ul>
<script>
new Vue({
el: '#app',
data: {
fruit: {
apple: 'Red',
banana: 'Yellow',
cherry: 'Red'
}
}
});
script>
このコードでは、fruit
オブジェクトの各キーと値をループし、
2.3 v-forとインデックス
v-for
では、インデックスを取得することもできます。これにより、ループ内でアイテムの位置を表示したり、スタイルを変更したりすることができます。
html<ul>
<li v-for="(item, index) in items" :key="index">
{{ index + 1 }}: {{ item.name }}
li>
ul>
<script>
new Vue({
el: '#app',
data: {
items: [
{ name: 'Apple' },
{ name: 'Banana' },
{ name: 'Cherry' }
]
}
});
script>
ここでは、index
を使ってアイテムの番号を表示しています。
3. 条件付きレンダリングと繰り返しレンダリングの組み合わせ
条件付きレンダリングと繰り返しレンダリングは、複雑なUIを構築する際に非常に役立ちます。例えば、特定の条件に基づいてリストを表示する場合などです。
html<ul>
<li v-for="item in items" :key="item.id" v-if="item.isVisible">
{{ item.name }}
li>
ul>
<script>
new Vue({
el: '#app',
data: {
items: [
{ id: 1, name: 'Apple', isVisible: true },
{ id: 2, name: 'Banana', isVisible: false },
{ id: 3, name: 'Cherry', isVisible: true }
]
}
});
script>
この例では、isVisible
がtrue
のアイテムのみが表示されます。v-for
とv-if
を組み合わせることで、リストの各アイテムを条件に基づいてフィルタリングできます。
4. 最適化
条件付きレンダリングや繰り返しレンダリングを使用する際は、最適化を考慮することが重要です。特に、v-if
とv-for
を同じ要素に使う場合、パフォーマンスに影響を与える可能性があるため、注意が必要です。特に、v-if
をv-for
の中で使う場合、条件が変わるたびにDOMの再描画が発生し、パフォーマンスが低下することがあります。この場合、v-show
や別の最適化手法を検討することが推奨されます。
まとめ
Vue.jsにおける条件付きレンダリングと繰り返しレンダリングは、動的なUIを構築するための非常に強力なツールです。v-if
、v-else
、v-show
、そしてv-for
を駆使することで、アプリケーションの状態に応じたインターフェースを柔軟に作成できます。これらのディレクティブを理解し、最適化を心掛けながら使用することで、効率的でパフォーマンスの良いVue.jsアプリケーションを作成することができます。