基礎からメモ: Vue.js CH2-p67 テンプレートにおける条件分岐
v-if
やv-show
ディレクティブを使うと、テンプレートベースで条件分岐させることができる。
[index08.html]
<div id="app"> <p v-if="ok">v-if条件による描画</p> <p v-show="ok">v-show条件による表示</p> </div>
[main08.js]
var app = new Vue({ el: '#app', data: { ok: true }, })
コンソールでapp.ok = false
とすると、表示が消える。ただしv-if
とv-show
では消え方が違う。
v-if
ではコメント化されDOM自体が消える。v-show
ではスタイルがdisplay: none
になって、文字通り表示が見えなくなっているだけだ。
<div id="app"> <!----> <p style="display: none;">v-show条件による表示</p> </div>
v-if
によって表示がされなかった場合、DOMごと消えるのでDOMに対する監視状態もされなくなる。よって再度表示された時は初期化されている。v-show
で表示がされなかった場合は、画面から見えなくなるだけなのでDOMに対するリアクティブな状態は保たれている。切り替えの頻度が高くパフォーマンスに影響する場合はv-show
を、そうでない場合やDOMが残っているとエラーが起きるような場合はv-if
をと使い分けるとよい。
templateタグによってグループ化する
v-if
はHTMLタグの属性として記述するものなので、複数のDOMの表示を一緒に切り替えたい場合は一つひとつのタグに記述する必要がある。沢山のタグの場合は面倒なので、<template>タグ
で囲ってしまう方法が使える。ただしこの方法はv-show
には使えない。
<template v-if="ok"> <header>タイトル</header> <div>コンテンツ</div> </template>
v-else-if
とv-else
複数条件分岐にv-else-if
とv-else
が使える。
<div id="app"> <div v-if="type === 'A'"> TYPE は A </div> <div v-else-if="type === 'B'"> TYPE は B </div> <div v-else> 全ての条件を満たさなかった </div> </div>
var app = new Vue({ el: '#app', data: { type: 'C' }, })
app.type
に何を代入するかによって表示が変わるはずだ。
ユニークなkey
の使用
v-if
によるグループ化で同じDOMに作用させた場合、属性の状態が残ったり、トランジションが発動しないなどの動作不良が起きる場合がある。そういうときはそれぞれの要素が違うことを明示するためにユニークなkey
を設定することで回避できる。
<div v-if="type === 'A'" key="first-item"> TYPE は A </div> <div v-else-if="type === 'B'" key="second-item"> TYPE は B </div> <div v-else key="others"> 全ての条件を満たさなかった </div>
v-if
やv-show
ディレクティブを使うと、テンプレートベースで条件分岐させることができる。v-if
ではコメント化されDOM自体が消える。v-show
ではスタイルがdisplay: none
になる。<template>タグ
にv-if
を使い囲ってしまうことで、複数のDOMを同時に条件分岐させることができる。v-if
でグループ化されたタグの動作エラーを回避するには、各タグにユニークなkey
を付与する。