vue.jsのページにアクセスすると一瞬画面上にマスタッシュ{{ message }}(ダブルカーリーブレース)が表示されます。マスタッシュが一瞬ページに表示されるのは閲覧するユーザにとってあまりいいものではありません。そのためvue.jsにはv-cloakディレクティブが準備されており、HTMLの要素にv-cloakを設定することでアクセス時のマスタッシュを表示させないように設定することができます。

v-cloakの設定方法

人によってはマスタッシュが表示されるということがどういう意味なのかわからない人もいるかもしれません。最初にマスタッシュが表示されるとはどのようなものかを確認してv-cloakの設定方法を確認します。

マスタッシュが表示されるとは

h1タグにVueインスタンスのデータプロパティmessageを表示させるindex.htmlファイルを作成します。


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>v-cloak</title>
</head>

<body>
  <div id="app">
    <h1>{{ message }}</h1>
  </div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
new Vue({
  el: '#app',
  data: {
    message: 'v-cloakの設定',
  }
})
</script> 
</body>
</html>

ブラウザでindex.htmlファイルを開くと一瞬画面上に下記のように{{ message }}が表示されるのを確認することができます。表示されるのは非常に短い時間のでどのようなものが表示されるかまでわからない場合もあります。

マスタッシュが表示される
マスタッシュが表示される

マスタッシュは一瞬ブラウザ上に表示されるだけなので、すぐにmessageの値である”v-cloakの設定”がブラウザ上に表示されます。

Vueインスタンス作成完了後の画面
Vueインスタンス作成完了後の画面

マスタッシュ見えましたか?マスタッシュが表示されるということが確認できたのでv-cloakの設定を行います。

v-cloakの設定

v-cloakディレクティブは要素ごとに設定を行うことができ、Vueのインスタンスの作成が完了が終わるまで要素上に存在するディレクティブです。

Vueインスタンスの作成中には要素に属性としてv-cloakディレクティブが設定された状態となり、インスタンス作成が完了すると要素から消えます。

公式のドキュメントではThis directive will remain on the element until the associated Vue instance finishes compilation.と記述されています。
fukidashi

v-cloakを要素に設定すればいいだけというものではなくCSSと組み合わせる必要があります。v-cloakをdiv要素(id=”app”でvue.jsのマウントポイント)に追加し、styleタグの中でv-cloakのCSS設定を行います。インラインで設定した場合には効果がないので注意してください。


<head>
  <meta charset="UTF-8">
  <title>v-cloak</title>
  <style>
    [v-cloak] {
      display: none;
    }
  </style>
</head>

<body>
  <div id="app" v-cloak>
    <h1>{{ message }}</h1>
  </div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
v-cloakはdiv要素の属性なのでcssの属性セレクタ[]を使用しています。v-cloakが表示されている間はdisplay:noneで非表示設定が行われています。
fukidashi

タグへのv-cloakの追加とCSSの設定を適切に行うとブラウザでindex.htmlファイルを開いても先ほどまで一瞬表示されていたマスタッシュ{{ }}が表示されることはありません。

vue.jsのマウントポイントである<div id=”app”>タグにv-cloakを追加しましたが下記のように一部のタグのみv-cloakを設定してみます。


<div id="app">
  <h1 v-cloak>{{ message }}</h1>
  <h1 v-cloak>{{ message }}</h1>
  <h1>{{ message }}</h1>
</div>

仕様通りv-cloakは要素ごとに設定を行うことができるので、設定を行わなかったh1タグのマスタッシュのみアクセス直後に一瞬だけ画面に表示されます。

マスタッシュが表示される
マスタッシュが表示される

v-cloakを設定すればアクセス直後のマスタッシュの表示を抑えることができることがわかりました。