如何在页面加载时隐藏 VueJS 语法?

IT技术 javascript vue.js
2021-03-08 12:05:33

也许这是一个微不足道的问题。

所以,当我在浏览器上运行我的 vuejs 应用程序时,启用限制下载速度(设置为低连接)。我在浏览器中得到了未完成的 vue 语法输出。

Vue js 语法出现在浏览器中

我知道我们可以通过在整个页面加载之前显示加载图像来解决这个问题,但是有没有最好的解决方案来解决这个问题?

6个回答

你可以使用v-cloak指令,如果你将它与正确的 CSS 结合起来,它将隐藏 Vue 实例直到编译完成。

HTML:

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

CSS:

[v-cloak] { display: none; }
display:none在现有的 HTML 上,对于 SEO 来说是一个糟糕的标志。我认为在页面加载之前使用某种覆盖可能会更好。
2021-04-29 12:05:33
到主Appdiv应该没问题
2021-05-04 12:05:33
似乎v-cloak应该是默认值,如果有人真的想显示{{ }}他们应该使用类似v-uncloak.
2021-05-09 12:05:33
在 api 中说: [v-cloak] { display: none; } <div v-cloak> {{ message }} </div> 这意味着,我应该v-cloak希望隐藏的每个元素中添加属性?
2021-05-13 12:05:33
这行得通,但老兄很笨重。我真的希望有更优雅的东西。+1虽然
2021-05-18 12:05:33

我附上了以下代码笔。你可以看到有和没有的区别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

@twigg 这就是重点。第一个显示常规标签,第二个显示使用v-cloak属性的隐形标签
2021-05-08 12:05:33
是的,我明白了……谢谢,你的代码笔会对新来者有所帮助。
2021-05-10 12:05:33
当 vuejs 正在加载时,你仍然会得到第一个 {{test}} 所以它不是一个完美的答案
2021-05-18 12:05:33

正如其他人所建议的那样,使用v-cloak是正确的解决方案。然而,正如@ DelightedD0D 提到的那样,它很笨重。简单的解决方案是在指令的伪选择器::before添加一些 CSS v-cloak

在你的 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%;
}

当然,您需要提供一个有效且可访问的加载器图像路径。它会呈现类似的东西。

在此处输入图片说明

希望能帮助到你。

使用v-cloak指令可以隐藏未编译的 mustache 绑定,直到 vue 实例编译完成。在编译之前,您必须使用 CSS 块来隐藏它。

HTML:

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

CSS:

[v-cloak] {
  display: none;
}

<div>在编译完成之前是不可见的。

您可以看到此链接在加载过程中隐藏元素v-cloak以更好地理解。

不要在 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")
})