【Vue.js】テンプレート制御ディレクティブの色々

テンプレート制御ディレクティブ

v-once

初回だけテキストバインディングを行いたい時に使う。
例えばボタンを押すと文字列が反転するfunctionを書いてみる。
HTMLコードはこう

<div id="vm">
  <p>{{ message }}</p>
  <button v-on:click="clickButton">Click!</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

文字列を反転させたいのでsplitで分けてreverseで反転しjoinでくっつければ良い。

var vm = new Vue({
	el: '#vm',
  data: {
  	message: 'Hello Vue.js!'
  },
  methods: {
  	clickButton: function(event){
    	this.message = this.message.split('').reverse().join('')
    }
  }
})

ボタンを押すとHello Vue.js!が!sj.euV olleHとなる。
ここで、pタグにv-onceを付けると最初の1回しかバインディングを行わないので、ボタンを押しても反転しなくなる。

<div id="vm">
  <p v-once>{{ message }}</p>
  <button v-on:click="clickButton">Click!</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

v-pre

要素と全ての子要素のコンパイルをスキップすることができる。
例えば、先ほどのpタグにv-preをつけてみる。

<div id="vm">
  <p v-pre>{{ message }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

すると、Hello Vue.js!ではなく、{{ message }}がそのまま表示される。
これによりXSS対策や、コンパイルのスピードをあげることができる。

v-html

プレーンなHTMLを挿入することができる。
指定した要素のinnerHTMLを更新することができる。
例えば先ほどのmessageでVue.js!の文字色を変えてみる。

var vm = new Vue({
	el: '#vm',
  data: {
  	message: 'Hello <span style="color:red;">Vue.js!</span>'
  }
})

このままだと赤文字にならず、spanタグ表記が見えたままになってしまう。
そこでv-htmlを使ってみる。

<div id="vm">
  <p v-html="message"></p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

こうすることでmessageのhtmlが読み込まれ、Vue.js!が赤く表記される。
サーバーサイドから取得したHTMLを表示する時によく使う。
XSS脆弱性を引き起こす場合もあるので、ユーザーが入力するようなコンテンツには使ってはいけない。

v-cloak

ページを表示し始めている時に、マスタッシュタグなどのテンプレートが表示されるのを防ぐことができる。
つまり、チラツキを抑えることができる。
JavaScript

var vm = new Vue({
	el: '#vm',
  data: {
  	message: 'Hello Vue.js!'
  }
})

HTML

<div id="vm">
  <p v-cloak>{{ message }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

そしてCSSを使う。

[v-cloak] {
  display: none;
}

こうすることで、表示前の読み込み中はv-cloakのついたタグは非表示となるのでチラツキを抑えることができる。

v-text

マスタッシュ構文の代わりにテキストをそのまま読み込める。
上のHTMLをこうするだけでOK。

<div id="vm">
  <p v-text="message"></p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

これでHello Vue.js!と表示できる。
ただし、マスタッシュ構文の方が使いやすい場合もある。

<div id="vm">
  <p v-text="message"></p>
  <p>{{ message }}ウホ!</p>
  <p>{{ message }}ウホホッ!</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

上記のように、message部分を共有したい場合はマスタッシュの方が良い。

v-bindの省略記法

よく使うv-bindは省略することができる。

<a v-bind:href="url">リンクページ</a>
<a :href="url">リンクページ</a>