Comment masquer la syntaxe VueJS pendant le chargement de la page?

Peut-être que c'est une question triviale.

Donc, quand je lance mon application vuejs sur le navigateur avec active la vitesse de téléchargement de limitation (définit la connexion faible). J'ai obtenu une sortie de syntaxe vue inachevée dans le navigateur.

La syntaxe Vue JS apparaît dans le navigateur

Je sais que nous pouvons tromper cela en montrant chargement de l'image avant que la page entière ne soit chargée, mais y a-t-il une meilleure solution pour résoudre ce problème?

89
demandé sur Mridang Agarwalla 2016-03-23 22:15:02

10 réponses

Vous pouvez utiliser la directiveV-cloak , qui masquera L'instance Vue jusqu'à la fin de la compilation.

HTML:

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

CSS:

[v-cloak] { display: none; }
144
répondu Gus 2018-03-26 20:02:59

J'ai joint le codepen suivant. Vous pouvez voir la différence avec et sans 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

35
répondu gurghet 2016-05-11 14:44:27

Comme suggéré par d'autres en utilisant V-cloak est une solution appropriée. Cependant, comme @ DelightedD0D l'a mentionné, C'est maladroit. La solution Simple consiste à ajouter du CSS dans le pseudo sélecteur ::before de la directive v-cloak.

Dans votre fichier sass/less quelque chose du type

[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%;
}

Bien sûr, vous devez fournir un chemin d'accès valide et accessible à l'image du chargeur. Il rendra quelque chose comme.

entrez la description de l'image ici

J'espère que ça aide.

17
répondu schartz 2018-01-18 09:05:04

En utilisant la directive v-cloak, Vous pouvez masquer les liaisons moustache Non compilées jusqu'à ce que l'instance vue ait terminé la compilation. Vous devez utiliser le bloc CSS pour le masquer jusqu'à ce qu'il soit compilé.

HTML:

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

CSS:

[v-cloak] {
  display: none;
}

CE <div> ne sera pas visible tant que la compilation n'est pas terminée.

Vous pouvez voir ce lien Masquer les éléments lors du chargement en utilisant v-cloak pour une meilleure sous-estimation.

5
répondu Summonjoy 2018-06-25 15:30:41

Vous pouvez déplacer n'importe quel rendu vers un simple wrapper composant . L'initialisation VueJS par exemple new Vue(....) ne devrait pas contenir de HTML en dehors de ce composant wrapper unique.

Selon la configuration, vous pouvez même avoir <app>Loading...</app> app est le composant wrapper avec N'importe quel HTML ou texte de chargement entre lequel est ensuite remplacé lors du chargement.

2
répondu A. Hall 2018-01-08 06:54:02

Utilisez <v-cloak> pour masquer votre code Vue avant de lier les données aux endroits pertinents. Il est en fait situé dans un endroit sur la documentation Vue que n'importe qui pourrait le manquer à moins que vous le recherchiez ou que vous le lisiez à fond.

1
répondu dakshinasd 2018-04-07 10:56:21
**html**
<div v-cloak>{{ message }}</div>

**css**
[v-cloak] { display: none; }
1
répondu karthik 2018-08-02 11:02:46

N'incluez aucune syntaxe vuejs dans le fichier HTML:

<!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>

Dans votre JavaScript principal, vous pouvez:

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

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

Voir le modèle vuetify webpack pour référence.

Une autre solution consiste à utiliser:

<!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>

Avec:

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

const app = new Vue({});

window.addEventListener("load", async () => {    
  app.$mount("#app")
})
1
répondu ysdx 2018-08-14 12:53:34

Oui, vous pouvez utiliser v-cloak, j'aime utiliser spinkit, est une grande bibliothèque avec uniquement du CSS, consultez un exemple simple:

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>

Lien: - http://tobiasahlin.com/spinkit/

0
répondu fitorec 2018-06-05 18:25:51

Pour ceux qui utilisent v-cloak dans une vue avec plusieurs fichiers Laravel Blade et que cela ne fonctionne pas, essayez d'utiliser v-cloak sur le fichier Blade parent plutôt que dans n'importe quel fichier Blade enfant.

-1
répondu user8581607 2018-08-24 06:01:39