【Vuejs】ディレクティブを解説(チートシート風)
スポンサードリンク
おはようございます。Shotaです。本記事を読んでいる人の中には、
🤨「Vuejsでのディレクティブが少しわからない....」
😥「Vuejsのディレクティブに関する説明記事があれば....」
このように考えている方も少なくないでしょう。
今回の記事では、Vuejsのディレクティブについて詳細に解説します。
Vuejsを使い慣れている人にはもうおなじみでしょうが、Vuejsのディレクティブは非常に良くできており、シンプルな構造をしているので理解しやすいと思います。
それでは早速、本題に入りましょう。
v-for
v-for
はJavaScriptでおなじみのfor
の、Vuejs版になります。テンプレート内で繰り返し構文を使いたい場合には、配列に基づいてオブジェクトや配列をリスト表示させるためにv-for
ディレクティブを活用します。
v-for
はvalue in values
のような形式で書きます。(わかりやすく言えば「変数 in リスト」の形)Vuejsでは、v-for
を使って反復処理できます。
▼HTMLファイル
<html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://unpkg.com/vue@next"></script> <script src="main.js"></script> </head> <body> <h1>ProtoTyping</h1> <hr> <div id="app"> <ul> <li v-for="item in items" :key="item.message"> {{ item.message }} </li> </ul> <br> <ul> <li v-for="val in object"> {{ val }} </li> </ul> </div> </body> </html>
▼JavaScriptファイル
Vue.createApp({ el: '#app', data() { return { items: [ { message: 'One' }, { message: 'Two' }, ], object: { title: 'How to do list in vue', author: 'Nameless', created_at: '2021-12-20', } } }, }).mount('#app')
上記の例ではitem
しかセットされていませんが、(item, index) in items
のように第二引数を用いてインデックス(いわゆる数字)をもたせられるようになります。また、同時に:key
属性(v-bind属性, 詳細は後述)をもたせるようにしましょう。これがないとVuejs内で予期せぬバグを起こす可能性があります。
あと、v-for
は構文の曖昧さを避けるために、同じエレメント内でv-if
ディレクティブを記述できないのでご注意を。
v-on
v-on
ディレクティブは主に、マウス動作時などイベント発生時のJavaScriptの実行を関連付けられます。@
と省略されて使われます。
▼HTMLファイル
<html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://unpkg.com/vue@next"></script> <script src="main.js"></script> </head> <body> <h1>ProtoTyping</h1> <hr> <div id="app"> <button @click="count += 1">Add 1</button> <p>Clicked {{ count }} times.</p> </div> </body> </html>
▼JavaScriptファイル
Vue.createApp({ el: '#app', data() { return { count: 0 } }, }).mount('#app')
上記はクリックするとクリックした回数を表示するだけの簡単なWEBアプリです。
多くのイベント発生のロジックはより複雑になっていくので、v-on
属性の値にJavaScript式を記述するのは現実的ではありません。そのため、v-on
は呼び出したいメソッドの名前、インラインJavaScript式のメソッド指定も受け付けます。
▼HTMLファイル
<div id="app"> <button @click="countUp">Add 1</button> <button @click="countDown(-1)">Remove 1</button> <p>Count: {{ count }}</p> </div>
▼JavaScriptファイル
Vue.createApp({ el: '#app', data() { return { count: 0 } }, methods: { countUp: function() { this.count += 1 }, countDown: function(num) { this.counter -= num } }, }).mount('#app')
v-model
双方向からデータを紐付ける(データバインディング)場合は、v-model
ディレクティブを使用します。
例えば、formのinput
要素、textarea
要素やselect
要素に多用されます。しかし、value
, checked
やselected
属性の初期値は無視されるので注意が必要です。
▼HTMLファイル
<input type="text" v-model="message" placeholder="edit me"> <p>{{ message }}</p>
▼JavaScriptファイル
Vue.createApp({ el: '#app', data() { return { message: 'Hello Vue' } } }).mount('#app')
上記のプログラムでは、input
属性で指定した入力フォーム内に「Hello Vue」が表示されます。
v-if
, v-else-if
, v-else
v-if
ディレクティブは、ブロックを条件に応じて表示したい時に使用されます。ブロックは、ディレクティブの四季が真の値を返す時に使用されます。
v-else-if
とv-else
要素は、それぞれv-if
要素あるいはv-else-if
要素の直後に書く必要があります。
template
タグでグルーピング化し、v-if
と併用することでより複雑な条件式を作れます。
<div v-if="type === 'A'">A</div> <div v-else-if="type === 'B'">B</div> <div v-else>Not A or B</div>
v-once
一度目だけ変数が変更した場合に更新を行うことで、一度だけ展開できます。2回目以降は変数が変更しても更新されないので十分に注意してください。
<span v-once>This will never change: {{ message }}</span>
v-html
二重中括弧のmustaches({{}}
)は、データをHTMLではなくプレーンなテキストとして扱います。
そのため、実際のHTMLとして出力するにはv-html
ディレクティブを使用する必要があります。
▼HTMLファイル
<div id="app"> <p>Using html: {{ rawHtml }}</p> <p>Using v-html directive: <span v-html="rawHtml"></span></p> </div>
▼JavaScriptファイル
Vue.createApp({ el: '#app', data() { return { rawHtml: '<span style="color: red;">RED</span>' } } }).mount('#app')
v-bind
v-bind
ディレクティブはv-model
とは異なって単一方向のデータバインディングになります。:
と省略されて使われることが多いです。
より具体的に言うと、data
やmethods
で更新されたデータをDOMに反映するのみで、inputタグのようにDOM側で値が変更されてもdata
, methods
で用いられる変数は変更されません。
▼HTMLファイル
<div id="app"> <a :href="url">SAMPLE</a> </div>
▼JavaScriptファイル
Vue.createApp({ el: '#app', data() { return { url: 'https://sample.com/' } } }).mount('#app')
まとめ
今回の記事では、非常に簡潔ではありますがチートシートのような感じでVuejsのディレクティブを徹底解説しました。
今回の記事を参考に、Vuejsのディレクティブについて理解を深めていただければ幸いです。
今回の記事はこれで以上です。