Vue.js　テンプレート構文

#Vue.jsテンプレート構文

前回の記事はこちら
[Vue.jsで作るtodoアプリ](https://qiita.com/fumiya0414/items/8d22c23dc0bff63dcc02)

今回はVue.jsのテンプレート制御ディレクティブについてです。
[jsfiddle](https://jsfiddle.net/)で実際に記述しながら読むことをおすすめします。

##代表的なテンプレート制御ディレクティブ
v-once　初回だけバインディング
v-pre　要素とすべての子要素のコンパイルをスキップ
v-html　プレーンなhtmlを挿入
v-cloak　インスタンスの準備が終わると取り除かれる
v-text　マスタッシュ構文の代わりに使用

##v-onceディレクティブ（描画を１回に固定）
初回だけテキストバインディングを行うディレクティブです。

まずは以下のコードを書いてみます。

```html:index/html
<div id="app">

<p>
  {{ message }}
</p>

<button v-on:click="clickHandler">
  Click
</button>

</div>

<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

```javascript:index.js
var app = new Vue({
  el:'#app',
  data:{
    message:"Hello Vue.js!"
  },
  methods:{
    clickHandler:function(){
      this.message = this.message.split('').reverse().join('')
    }
  }
})
```

[![Image from Gyazo](https://i.gyazo.com/ef8189d6d0a369c095ccbfa6079e7230.gif)](https://gyazo.com/ef8189d6d0a369c095ccbfa6079e7230)

clickボタンを押すたびにv-onディレクティブで
"Hello Vue.js!"の文字が反転します。

pタグにv-onceディレクティブを追記します。

```html:index/html
<p v-once>    <!--追記-->
  {{ message }}
</p>
```

[![Image from Gyazo](https://i.gyazo.com/7e121d0f57fd7cf6ba745cab10caabec.gif)](https://gyazo.com/7e121d0f57fd7cf6ba745cab10caabec)

clickボタンを押しても文字列は変わらなくなりました。
このようにv-onceディレクティブは初回のみにバインディングを固定します。
描画コストを下げるため初回だけ評価しバインディングする時に使用します。

##v-preディレクティブ （要素とすべての子要素のコンパイルをスキップ）
v-preディレクティブを設定するとバインディングをスキップします。
こちらは以下十分なので説明は割愛します。
生のマスタッシュ構文を使用したい場合や
ノードをスキップしてコンパイルのスピードを上げたい場合に使います。

[![Image from Gyazo](https://i.gyazo.com/5d2fc2234db9b1df5c398973ea15afca.png)](https://gyazo.com/5d2fc2234db9b1df5c398973ea15afca)

このようにmessageの内容はバインディングせずスキップしていることがわかります。

##v-htmlディレクティブ (プレーンなhtmlを挿入)

v-htmlディレクティブを使用すると指定した要素のinnnerHTMLを更新できます。

```html:index/html
<div id="app">
　<p>
  　{{ message }}
　</p>

　<p v-html="message">

　</p>  
</div>

<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

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

[![Image from Gyazo](https://i.gyazo.com/e4d398030e4a24866d714fc0bd7fd518.png)](https://gyazo.com/e4d398030e4a24866d714fc0bd7fd518)

最初のpタグはmessageの中身がテキストとして評価されています。
Vue.jｓがXSS対策をしてあるためこのような結果になります。

下のpタグには属性としてv-htmlディレクティブが設定してあるため
messageの中身はhtmlとして評価／描画されています。

v-htmlディレクティブは信頼できるデータのみ使用しましょう。

##v-cloakディレクティブ (コンパイル前の表示を隠す)

vディレクティブで描画したデータをよく見ると読み込み時に
マスタッシュ構文が１瞬表示されてチラツキが起こります。

[![Image from Gyazo](https://i.gyazo.com/3ef59f3e302604f767ff13d25c114caa.gif)](https://gyazo.com/3ef59f3e302604f767ff13d25c114caa)

v-cloakディレクティブを使うとインスタンスのコンパイルが終わるまで
CSSを使って該当の要素を非表示にすることができます。
※v-cloakディレクティブはインスタンスの準備が終わると自動的に取り除かれます。

```html:index/html
<div id="app">
  <p v-cloak>
    {{message}}
  </p>
  
</div>

<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

```javascript:index.js
var app = new Vue({
  el:'#app',
  data:{
    message:"Hello Vue.js!"
  }
})
```

```css:index.css
[v-cloak]{   /* vディレクティブの指定は[]を使う */
  display:none;
}
```
[![Image from Gyazo](https://i.gyazo.com/e839f7da9ce2540a772a3e61bb6c72cc.gif)](https://gyazo.com/e839f7da9ce2540a772a3e61bb6c72cc)

流れとしてはコンパイルの完了時にv-cloakが自動的に削除され
CSSのdisplay:noneが効かなくなり表示されます。

##v-textディレクティブ(マスタッシュの代わりにディレクティブを使う)

マスタッシュ構文の代わりにディレクティブを使ってデータバインディングをします。

```html:index/html
<div id="app">

  {{ message }}
  
  <p v-text="message">
    
  </p>
</div>

<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

```javascript:index.js
var app = new Vue({
  el:'#app',
  data:{
    message:"Hello Vue.js!"
  }
})
```

[![Image from Gyazo](https://i.gyazo.com/7bc29734379e606dc5402ac5846b46ae.png)](https://gyazo.com/7bc29734379e606dc5402ac5846b46ae)

上はマスタッシュ構文、下はv-textディレクティブで表示しています。
得られる結果は同じですがv-textディレクティブは配下のテキストをまるごと置き換えます。
※コードの可読性を担保するためなるべく統一しましょう。

このようにテンプレート構文を使用することで
ディレクティブの動作を制御することが可能です。

次回はjavascript式とフィルタです。
[Vue.jsで使えるjavascript式とフィルタの使い方](https://qiita.com/fumiya0414/items/95361a25965e0c112d67)