惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
MyScale Blog
MyScale Blog
D
DataBreaches.Net
S
SegmentFault 最新的问题
L
LangChain Blog
Blog — PlanetScale
Blog — PlanetScale
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
S
Security Affairs
The Register - Security
The Register - Security
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
I
InfoQ
人人都是产品经理
人人都是产品经理
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 叶小钗
O
OpenAI News
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
AI
AI
V
V2EX - 技术
T
Threatpost
Webroot Blog
Webroot Blog
Hacker News: Ask HN
Hacker News: Ask HN
The Hacker News
The Hacker News
Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Cloudflare Blog
W
WeLiveSecurity
Cyberwarzone
Cyberwarzone
S
Security @ Cisco Blogs
S
Schneier on Security
Jina AI
Jina AI
Hacker News - Newest:
Hacker News - Newest: "LLM"
TaoSecurity Blog
TaoSecurity Blog
Help Net Security
Help Net Security
Google Online Security Blog
Google Online Security Blog
P
Privacy International News Feed
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
I
Intezer
Vercel News
Vercel News
NISL@THU
NISL@THU
aimingoo的专栏
aimingoo的专栏
酷 壳 – CoolShell
酷 壳 – CoolShell

码云笔记

现代富文本编辑器为什么最终都会抛弃 DOM? 去哪里买抖音号?抖音小号在线购买-抖音小号出售批发 实名闲鱼小号出售|闲鱼账号批发|咸鱼发布账号|出售闲鱼发布账号 zfb号购买-支付宝小号购买-实名支付宝购买号-企业支付宝购买-支付宝小号批发 个人支付宝实名账号出售|v2/v3支付宝账号出售|实名支付宝小号购买 闲鱼账号哪里有卖-闲鱼实名账号购买的途径 Java注解的实现原理是什么? Agentation MemPalace 《置身钉内》之好词好句好段摘抄 AI有声书革命!万象有声全自动生产线,7元/万字颠覆网文有声化行业 详解CentOS 7跨版本迁移Rocky Linux9 生产环境安全升级教程 Java中序列化与反序列化的含义是什么? 18. Python 标准库之 Json 模块
Vue 的 v-cloak 和 v-pre 指令有什么作用?
刘俊杰 普通 · 2026-06-15 · via 码云笔记

AI 概述

本文讲解Vue中v-cloak与v-pre两个指令的用法与区别。v-cloak搭配CSS可避免页面闪烁暴露模板语法,适用于CDN引入、直写模板的场景;v-pre用于跳过编译,原样展示内容,常用来展示模板代码、处理静态文本。二者用途不同,切勿混用错用。

Vue 的 v-cloak 和 v-pre 指令有什么作用?

{{ userName }} 直接露在页面上,这个锅我见过不止一次。

页面一刷新,接口还没回来,Vue 还没接管 DOM,用户先看到一坨模板语法。等一两百毫秒后页面又正常了。测试环境没人管,到了线上低端机、弱网、后台管理系统首屏一堆资源加载时,这个问题就很扎眼。

这个时候才该想起 v-cloak

v-cloak 不是用来优化性能的,也不是让 Vue 渲染更快的。它干的事很土:Vue 没编译完之前,把这块 DOM 先藏起来。Vue 实例挂载完成后,这个属性会被移除,CSS 失效,页面再显示出来。

最常见写法就这样:

const appHtml = `
  <div id="app" v-cloak>
    <span>用户:{{ profile.name }}</span>
    <span>余额:{{ wallet.amount }}</span>
  </div>
`

document.body.innerHTML = appHtml

const style = document.createElement('style')
style.innerHTML = `
  [v-cloak] {
    display: none;
  }
`
document.head.appendChild(style)

Vue.createApp({
  data() {
    return {
      profile: { name: '加载中' },
      wallet: { amount: '--' }
    }
  },
  mounted() {
    setTimeout(() => {
      this.profile.name = '老周'
      this.wallet.amount = '86.50'
    }, 300)
  }
}).mount('#app')

这段代码里,关键不是 mounted,关键是 [v-cloak] { display: none; }

很多人只写了:

<div id="app" v-cloak>

然后发现没效果。

这地方我一般先看 CSS。v-cloak 本身不会帮你隐藏,它只是挂在 DOM 上的一个标记。你不写 CSS,它就跟没写差不多。

还有一点要注意,v-cloak 更适合 CDN 方式引 Vue 的老项目,或者页面里直接写模板的场景。现在很多工程化项目,模板会被构建工具提前编译,首屏看到 {{ xxx }} 的概率小很多。不是不能用,是用处没那么大。

真正容易踩的是这种后台页面:

document.body.innerHTML = `
  <div id="app" v-cloak>
    <div class="card">订单数:{{ stat.orderCount }}</div>
    <div class="card">退款数:{{ stat.refundCount }}</div>
  </div>
`

Vue.createApp({
  data() {
    return {
      stat: {
        orderCount: 0,
        refundCount: 0
      }
    }
  },
  async mounted() {
    const res = await fetch('/api/dashboard/stat')
    this.stat = await res.json()
  }
}).mount('#app')

接口慢不慢,跟 v-cloak 没直接关系。它管的是 Vue 接管 DOM 之前那一小段空窗期。接口慢了,页面会显示默认值或者 loading;Vue 还没启动,才会露出 {{ stat.orderCount }}

再看 v-pre

v-pre 正好是另一个方向:这块内容你别编译,原样显示。

比如写一个文档页,要展示 Vue 模板语法:

document.body.innerHTML = `
  <div id="app">
    <h3>模板示例</h3>

    <pre v-pre>
      <span>{{ user.name }}</span>
      <button @click="saveUser">保存</button>
    </pre>

    <p>当前用户:{{ currentUser }}</p>
  </div>
`

Vue.createApp({
  data() {
    return {
      currentUser: 'admin'
    }
  }
}).mount('#app')

这里我就会直接给 pre 加 v-pre

不加的话,Vue 会把 {{ user.name }} 当成真正的绑定去解析。轻则页面展示不对,重则控制台一堆告警。尤其是做低代码配置页、组件文档页、模板编辑器时,这个指令挺有用。

v-pre 还有一个小用途:跳过大量不需要编译的静态内容。

document.body.innerHTML = `
  <div id="app">
    <div v-pre class="license">
      这里是一大段固定协议文本。
      里面就算出现 {{ companyName }},也不要当成 Vue 变量。
    </div>

    <button @click="confirm">同意</button>
  </div>
`

Vue.createApp({
  methods: {
    confirm() {
      console.log('user confirmed')
    }
  }
}).mount('#app')

不过别指望它救性能。页面上真有几千行静态内容,问题大概率不在 v-pre,而在你为什么把这么一坨东西塞进 Vue 管的区域里。

这两个指令放一起看,其实很好分。

v-cloak 是“先别露出来,等 Vue 编译完”。

v-pre 是“这块别编译,我就想原样显示”。

我见过有人把 v-pre 当成防闪烁用,结果页面里的变量永远不更新:

document.body.innerHTML = `
  <div id="app" v-pre>
    用户名:{{ name }}
  </div>
`

Vue.createApp({
  data() {
    return {
      name: '东哥'
    }
  }
}).mount('#app')

这代码看一眼就不对。v-pre 放在 #app 上,相当于告诉 Vue:整个根节点下面都别解析。那你还挂 Vue 干什么。

正常应该是:

document.body.innerHTML = `
  <div id="app" v-cloak>
    用户名:{{ name }}

    <pre v-pre>
      页面里可以这样写:{{ name }}
    </pre>
  </div>
`

外层用 v-cloak 防止模板闪出来,里面需要展示模板源码的地方用 v-pre 保留原样。

这俩指令都不复杂,但挺能看出项目是不是糙。

页面一闪,先查 v-cloak 有没有配 CSS。

模板源码被 Vue 吃掉,先查该不该加 v-pre

别反着用。反着用,排查半天,最后发现不是 Vue 坑你,是你给 Vue 下了个错误命令。

以上关于Vue 的 v-cloak 和 v-pre 指令有什么作用?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

22

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Vue 的 v-cloak 和 v-pre 指令有什么作用?