今回はVue.jsのv-if,v-elseとv-showについて書いています。
v-if,v-elseとv-showの使い方について、簡単に説明した後にサンプルコードを載せていますので、確認してみてください。
載せているサンプルコードはVue.jsのバージョン3(Composition API)で検証しています。
公式の解説ページは下記になります。
条件付きレンダリング
v-if(v-else)はどう使う?
v-if
,v-else
は条件に応じて、画面表示を変えたい場合に使用します。
v-if
,v-else
を使うことで、画面要素の表示制御を行うことができます。
基本的にはv-if
で条件をつけます。
v-else
は条件に合わなかった場合の内容を定義するときに使用します。
実際の例を確認しましょう。
例えば、下記のようにv-if
を使用することができます。
<div v-if="fruit == 'apple'">
フルーツはリンゴです!
</div>
div
タグに対して、v-if
で条件をつけています。
条件が合っている場合(true
になる)時に中のタグが画面に表示されます。
上記の場合だと、fruit
変数がapple
という文字列だった場合は「フルーツはリンゴです!」が画面に表示されます。
先ほどの例にv-else
を使用してみます。
<div v-if="fruit == 'apple'">
フルーツはリンゴです!
</div>
<div v-else>
フルーツが何かわかりません!
</div>
このように使用すると、fruit
変数にapple
文字列以外のものが入っている場合はv-else
を通ります。
このようにして、条件が合わない場合(false
になる)に表示するタグを定義できます。
v-else
はv-if
かv-else-if
の後に書かないといけません。
v-else-if
ですが、条件がif
に合わなかった場合の条件をつけることが可能です。
例えば、下記のように使用します。
<div v-if="fruit == 'apple'">
フルーツはリンゴです!
</div>
<div v-else-if="fruit == 'banana'">
フルーツはバナナです!
</div>
<div v-else-if="fruit == 'melon'">
フルーツはメロンです!
</div>
<div v-else>
フルーツが何かわかりません!
</div>
v-if
で最初にfruit
変数がapple
か確認します。
apple
でなかった場合にbanana
か確認します。
さらに、apple
でもbanana
でもなかった場合にmelon
か確認します。
それぞれの条件に当てはまった時の内容が表示されます。
最後にどれでもなかった場合にv-else
配下の要素が表示されます。
v-showはどう使う?
v-show
もv-if
と同じように表示制御を行います。
v-if
と同じように使用することが可能です。
v-if
と違うところはv-show
ではcss
のdisplay
プロパティを切り替えます。
そのため、表示・非表示を切り替えますが、画面に要素が残った状態になるというところです。
v-show
では、そうでなかった時の条件をつけるv-else
は使用できません。
実際に使う場合は下記のように、v-if
と同様にして使用することが可能です。
<div v-show="fruit == 'apple'">
フルーツはリンゴです!
</div>
条件が合っている場合(true
になる)に「フルーツはリンゴです!」が表示されます。
条件が合わない場合(false
になる)には、下記のように要素のdisplay
プロパティがnone
になって、画面から非表示になります。
<div style="display: none;"> フルーツはリンゴです! </div>
v-if, v-else, v-else-ifを使用してみる
実際にv-if
・v-else
・v-else-if
を使用したコンポーネントを下記のように作ってみました!
ボタンを4つ配置して、押したボタンによって表示を切り替えています。
TailwindCSSを使用して、いい感じに装飾してみました。
<template>
<div class="m-5">
<div v-if="fruit == 'apple'">
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" role="alert">
フルーツはリンゴです!
</div>
</div>
<div v-else-if="fruit == 'banana'">
<div class="bg-yellow-100 border border-yellow-400 text-yellow-700 px-4 py-3 rounded relative" role="alert">
フルーツはバナナです!
</div>
</div>
<div v-else-if="fruit == 'melon'">
<div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded relative" role="alert">
フルーツはメロンです!
</div>
</div>
<div v-else>
<div class="bg-gray-100 border border-gray-400 text-gray-700 px-4 py-3 rounded relative" role="alert">
フルーツが何かわかりません!
</div>
</div>
<div class="flex mt-3">
<button @click="fruit = 'apple'" class="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded">
リンゴ
</button>
<button @click="fruit = 'banana'" class="ml-3 bg-yellow-500 hover:bg-yellow-700 text-white font-bold py-2 px-4 rounded">
バナナ
</button>
<button @click="fruit = 'melon'" class="ml-3 bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded">
メロン
</button>
<button @click="fruit = 'other'" class="ml-3 bg-gray-500 hover:bg-gray-700 text-white font-bold py-2 px-4 rounded">
果物以外!
</button>
</div>
</div>
</template>
<script>
import { ref } from 'vue'
export default({
setup () {
const fruit = ref('')
return {
fruit
}
}
})
</script>
スクリプトの方で、fruit
変数を作成して画面に返しています。
画面の方では、変数の内容を参照して、条件にあったアラートを表示するようにしました。
apple
だったら「フルーツはリンゴです!」でbanana
だったら「フルーツはバナナです!」といった形です。
それぞれのボタンを押した時に@click
でfruit
変数に文字列を格納しています。
実際に動作を確認してみます。
v-showを使ってみる
先ほどのv-if
・v-else-if
・v-else
の箇所をv-show
に切り替えてみます。
v-show
ではv-else
のようには書けないので、複数条件を指定することで同じように動作させてみました。
<div v-show="fruit == 'apple'">
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" role="alert">
フルーツはリンゴです!
</div>
</div>
<div v-show="fruit == 'banana'">
<div class="bg-yellow-100 border border-yellow-400 text-yellow-700 px-4 py-3 rounded relative" role="alert">
フルーツはバナナです!
</div>
</div>
<div v-show="fruit == 'melon'">
<div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded relative" role="alert">
フルーツはメロンです!
</div>
</div>
<div v-show="fruit !== 'apple' && fruit !== 'banana' && fruit !== 'melon'">
<div class="bg-gray-100 border border-gray-400 text-gray-700 px-4 py-3 rounded relative" role="alert">
フルーツが何かわかりません!
</div>
</div>
動作を確認すると、下記のようにdiv
タグのstyle
属性が変わって、非表示になっていることが確認できます。
コメント