Vue.jsでフロントエンドの描画を条件分岐する方法として
v-if
とv-show
があります。
v-if
v-if="条件"
と書くことで条件の真偽によりその要素を表示するかしないかをコントロールできます。
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no!</h1>
v-if
はディレクティブですので、複数の要素の表示/非表示をまとめてコントロールする際は以下のように
v-if
を<template>
タグに記述します。
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
条件が真のときに<template>
要素全体が表示され、偽のときには<template>
要素全体が非表示になります。
v-show
v-if
と同様にしてv-show="条件"
と書くことで条件の真偽によりその要素を表示するかしないかをコントロールできます。
v-if
との違いは、要素が常にDOMに保持されるということです。
つまり、v-show
は要素の表示と非表示の切り替えをCSSの書き換えによって実現します。
<h1 v-show="awesome">Vue is awesome!</h1>
<h1 v-show="not awesome">Oh no!</h1>
以上の要素がブラウザ上で描画されるときには
<h1>Hello!</h1>
<h1 style="display: none;">Oh no!</h1>
となり、結果的にはHello!
だけが表示されます。
どちらを使うべきか
v-if
は初期表示のコストが低い代わりに、SPA上で表示切り替えを行うためのコストが高いです。
そして、v-show
は初期表示のコストが高い代わりに、表示切り替えをCSSで行うため、表示の切り替えに要するコストが低いと言えます。
つまり、
切り替えの頻度が低ければv-if
切り替えの頻度が高ければv-show
という使い分けをすれば良さそうです。
一部のブラウザではv-show
は使えない
SafariとIEは、仕様でdisplay:none
のようなdisplayプロパティを適用できません。
従ってv-show
では要素の表示と非表示がコントロールできないので、v-if
を代わりに使用する必要があります。
追記
こちらの対処法について書かれているサイトがありましたので以下に記載します。
https://www.nedia.ne.jp/blog/2020/02/11/16033
参考