ページの読み込み中にVueJS構文を非表示にするにはどうすればよいですか?


155

多分これは些細な質問です。

そのため、ブラウザーでvuejsアプリケーションを実行すると、ダウンロード速度の調整が可能になります(低接続に設定)。ブラウザで未完成のvue構文出力を取得しました。

Vue js構文がブラウザーに表示されます

ページ全体が読み込まれる前に読み込み画像を表示することでこれをだますことができることはわかっていますが、これを修正する最善の解決策はありますか?

回答:


238

コンパイルが完了するまでVueインスタンスを非表示にするv-cloakディレクティブを使用できます。

HTML:

<div v-cloak>{{ message }}</div>

CSS:

[v-cloak] { display: none; }

APIで言う: [v-cloak] { display: none; } <div v-cloak> {{ message }} </div> それは、v-cloakIIが非表示にするすべての要素に属性を追加する必要があることを意味しますか?
アントニプトラ2016年

22
メインのAppdiv だけに問題はありません
Jeff

3
これは機能しますが、不格好です。もっとエレガントなものを本当に望んでいました。+1ただし
ウェズリー・スミス

27
のように思わv-cloakれるのがデフォルトであり、誰かが本当に見せたいのなら、{{ }}彼らはのようなものを使うべきv-uncloakです。
nu everest

3
display:none既存のHTMLでは、SEOの悪いフラグです。ページが読み込まれるまでは、なんらかのオーバーレイを使用する方が良いと思います。
T.Todua

41

以下のコードペンを取り付けました。ありとなしの違いを確認できますv-cloak

<div id="js-app">
[regular]Hold it... <span>{{test}}</span><br/>
[cloak]Hold it... <span v-cloak>{{test}}</span>
</div>

http://codepen.io/gurghet/pen/PNLQwy


1
ええ、私はそれを手に入れました...ありがとう、あなたのコーデックペンは新しい参入者の助けになるでしょう。
アントニプトラ2016年

vuejsの読み込み中に最初の{{test}}を取得するので、完全な答えではありません
twigg

12
@twiggそれがポイントです。1つ目は通常のタグを示し、2つ目はv-cloak属性を使用したクロークタグを示しています。
kb。

29

他の人が示唆するように、v-cloakを使用するのが適切なソリューションです。しかし、@ DelightedD0Dが言及したように、それは不格好です。簡単な解決策は::beforev-cloakディレクティブの疑似セレクターにCSSを追加することです。

あなたのsass / lessファイルで何かに沿って

[v-cloak] > * { display:none; }
[v-cloak]::before {
  content: " ";
  display: block;
  position: absolute;
  width: 80px;
  height: 80px;
  background-image: url(/images/svg/loader.svg);
  background-size: cover;
  left: 50%;
  top: 50%;
}

もちろん、ローダーイメージへの有効でアクセス可能なパスを提供する必要があります。それは次のようなものをレンダリングします。

ここに画像の説明を入力してください

それが役に立てば幸い。


7

v-cloakディレクティブを使用すると、vueインスタンスのコンパイルが完了するまで、コンパイルされていない口ひげバインディングを非表示にすることができます。コンパイルされるまで、CSSブロックを使用して非表示にする必要があります。

HTML:

<div v-cloak>
  {{ vueVariable }}
</div>

CSS:

[v-cloak] {
  display: none;
}

これ<div>は、コンパイルが完了するまで表示されません。

理解を深めるために、このリンクを使用v-cloakして読み込み中に要素を非表示にすることができます。


5

HTMLファイルにvuejs構文を含めないでください。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>My Super app</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="/app.js"></script>
  </body>
</html>

メインのJavaScriptでは、次のことができます。

import Vue from 'vue'
import App from './App'

new Vue({
  el: '#app',
  components: { App },
  template: '<App/>'
})

参考として、vuetify webpackテンプレートを参照してください。

別の解決策は以下を使用することです:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>My Super app</title>
  </head>
  <body>
    <div id="app" is="App"></div>
    <script src="/app.js"></script>
  </body>
</html>

と:

import Vue from 'vue'
import App from './App'
Vue.component("App", App);

const app = new Vue({});

window.addEventListener("load", async () => {    
  app.$mount("#app")
})

3

任意のレンダリングを単純なラッパー コンポーネントに移動できます。VueJSの初期化、たとえば新しいVue(....)には、その単一のラッパーコンポーネント以外のHTMLを含めないでください。

設定によっては<app>Loading...</app>アプリがラッパーコンポーネントであり、その間に読み込み中のHTMLまたはテキストがあり、読み込み時に置き換えられる場合もあります。



2

<v-cloak>関連する場所にデータをバインドする前にVueコードを非表示にするために使用します。実際にVueのドキュメント上の場所にあり、検索したり完全に読んだりしない限り、誰もが見逃す可能性があります。


2

うん、あなたは使うことができますv-cloak、私はスピンキットを使うのが好きです、CSSだけの素晴らしいライブラリです、簡単な例をチェックしてください:

var vm = null;
    setTimeout(function() {
    	vm = new Vue({
         el: '#app',
        data: {
          msg: 'Is great, using: ',
          url: 'http://tobiasahlin.com/spinkit/'
         }
      });
     }, 3000);
#app .sk-rotating-plane,
[v-cloak] > * { display:none }
body{
	background: #42b983;
	color: #35495e;
}
#app[v-cloak] .sk-rotating-plane {
	display:block;
	background-color: #35495e;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.6/vue.min.js"></script>

<link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/tobiasahlin/SpinKit/master/css/spinkit.css">


<div id="app" v-cloak>
    <div class="sk-rotating-plane"></div>
    <h1>Vue with c-cloak</h1>
  <p>
    {{ msg }}
    <a :href='url'>{{ url }}</a>
  <p>
</div>

リンク:-http : //tobiasahlin.com/spinkit/


1

次のv-ifように、データの準備ができているかどうかを確認する計算されたプロパティを使用することを好みます。

<template>
    <div v-if="shouldDisplay">
        {{ variableName }}
    </div>
    <div v-else>
      Here you can insert a loader
    </div>
</template>
<script>
export default {
    name: 'Test',
    data() {
        return {
            variableName: null,
        };
    },
    computed() {
        shouldDisplay() {
            return this.variableName !== null;
        }
    },
    mounted() {
        this.variableName = 'yes';
    },
};
</script>

このようにして、データが準備されていない場合にのみローダーを表示する方が簡単です(を使用v-else)。

この特定のケースでv-if="variableName"も機能しますが、より複雑なシナリオが存在する可能性があります。


0

複数のLaravelブレードファイルがあるビューでv-cloakを使用していて機能しない場合は、子ブレードファイルではなく、親ブレードファイルでv-cloakを使用してみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.