Skip to content
On this page

Vue 的模板就是 HTML,但加了两种特殊语法:插值表达式指令

插值表达式

插值的意思是"在这里插入值"。Vue 用 双大括号 把数据嵌入到 HTML 中。

vue
<template>
  <p>{{ message }}</p>
  <p>{{ number + 1 }}</p>
  <p>{{ flag ? '' : '' }}</p>
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello',
      number: 10,
      flag: true
    }
  }
}
</script>

页面会显示:

Hello
11

💡 Tip:{{ }} 里面可以写什么? 可以写合法的 JavaScript 表达式(能算出结果的代码)。比如:

  • 变量:{{ name }}
  • 运算:{{ a + b }}
  • 三元:{{ ok ? '是' : '否' }}
  • 调用方法:{{ message.toUpperCase() }} 但不能写语句!不能写 {{ if (true) { ... } }}{{ const x = 1 }}

原始 HTML — v-html

默认情况下, 会把内容当作纯文本处理,HTML 标签会被转义——也就是说,<b> 不会让文字加粗。 如果你真的需要渲染 HTML 字符串,用 v-html

vue
<template>
  <p>{{ rawHtml }}</p>              <!-- 显示: <b>粗体</b> -->
  <p v-html="rawHtml"></p>         <!-- 显示: 粗体 -->
</template>
<script>
export default {
  data() {
    return {
      rawHtml: '<b>粗体</b>'
    }
  }
}
</script>

🚫 Danger:v-html 有安全风险v-html 要慎用!如果你把用户输入的内容直接用 v-html 渲染,恶意用户可以在里面插入 <script> 标签执行攻击代码(XSS 攻击)。 规则:永远不要对用户输入的内容使用 v-html

什么是"指令"?

指令就是 Vue 提供的特殊属性,以 v- 开头。它们告诉 Vue "这个元素要做什么特殊处理"。 | 指令 | 作用 | 类比 | | v-html | 渲染 HTML | 用 HTML 内容替换元素 | | v-bind | 绑定属性 | 下篇讲 | | v-if | 条件显示 | 后面会讲 | | v-for | 循环渲染 | 后面会讲 | | v-on | 绑定事件 | 后面会讲 | | v-model | 双向绑定 | 后面会讲 | 这六个指令是 Vue 最核心的东西,后面会逐一详细讲解。

模板里只有文本?不,还有指令和表达式

总结一下,Vue 模板里你能用的东西:

<template>
  <!-- 1. 普通 HTML(照搬) -->
  <h1>标题</h1>
  <!-- 2. 插值表达式(动态内容) -->
  <p>{{ message }}</p>
  <!-- 3. 指令(v- 开头,做特殊操作) -->
  <a v-bind:href="url">链接</a>
</template>

这三种东西可以组合使用,构成 Vue 模板的全部能力。

新手常见问题

Q:为什么我的 一闪而过变成了真实数据? A:那是 Vue 还没加载完时,模板原样显示了。解决办法:在 index.html#app 上加 v-cloak(进阶内容,不急)。 Q:v-text 有什么区别? A:效果一样,<span v-text="msg"></span> 等于 <span></span>。一般直接用插值更直观。 下一步: 💡 Tip:Composition API 写法(Vue 3)

vue
<script setup>
import { ref } from 'vue'
const message = ref('Hello')
const rawHtml = ref('<b>粗体</b>')
</script>

模板部分完全一样,不变。 详见: