关于Vue.js中v-cloak
的使用,单看官方文档,可能看得有点迷糊:
这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。官方文档
一个问题
v-cloak指令的设计是为了解决什么问题?
?下面代码:
<div class="#app">
<p>{{message}}</p>
</div>
复制代码
在网络不好或加载数据过大的情况下,页面在渲染的过程会闪烁Mustache 标签:
为了用户有更好的优化体验,Vue加入了延缓响应的指令v-cloak
,在与css:[v-cloak] { display: none } 的配合下,可以隐藏未编译 Mustache 的标签直到实例准备完毕,v-cloak
属性才会被自动去除,对应的标签也才可见了。
当然上面的例子很难看到页面闪烁,因为太快了,我们延后加载 Vue 实例:示例参考
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
<script src="https://unpkg.com/vue@2.5.17/dist/vue.js"></script>
<style type="text/css">
[v-cloak] {
display: none !important;
}
</style>
</head>
<body>
<div id="app">
<span>{{ msg }}</span>
</div>
<script>
setTimeout(() => {
new Vue({
el: '#app',
data: {
msg: 'hello vue'
}
})
}, 2000)
</script>
</body>
</html>
复制代码
代码运行,在2000ms
前页面显示的是{{ msg }}
。
现在往<span>{{ msg }}</span>
中添加v-cloak
指令,在运行代码:
前2000ms
页面为空,2000ms
后出现hello vue
,解决了在实例挂载之前,页面闪现Mustache 标签
的尴尬问题。
v-cloak 无效问题
问题出现在[v-cloak] { display: none }
的失效。
1、v-cloak
的display
属性可能被层级更高css给覆盖了,解决方法:用important
加权:
[v-cloak] {
display: none !important;
}
复制代码
2、最好的解决办法就是在index.html
中,以内联css的方式引入。
<style type="text/css">
[v-cloak] {
display: none !important;
}
</style>
复制代码