一、概述
Vue 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
Vue 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。
template
一个字符串模板,用作 component 实例的标记。模板将会 替换 所挂载元素的 innerHTML
。挂载元素的任何现有标记都将被忽略,除非模板中存在通过插槽分发的内容。
提示:
template
并不会渲染到 DOM 上。
二、插值
数据绑定最常见的形式就是使用 “Mustache” (双大括号) 语法的文本插值:
<span>Message: {{ msg }}</span>
Mustache 标签将会被替代为对应组件实例中 msg
property 的值。无论何时,绑定的组件实例上 msg
property 发生了改变,插值处的内容都会更新。
接下来我们看一组示例:
<script setup lang="ts">
const msg = 'Hello, vue3.x!';
const htmlStr = '<div>Name: Li-HONGYAO</div>'
const isLogin = false;
const letetrs = "ABCDE";
const className = "wrap";
</script>
<template>
<!-- Mustache -->
<div>{{ msg }}</div>
<!-- v-text:指令 -->
<div v-text="msg"></div>
<!-- v-html:指令(可以识别HTML标签) -->
<div v-html="htmlStr"></div>
<!-- 表达式 -->
<div>LoginStatus:{{ isLogin ? '已登录' : '未登录'}}</div>
<div>{{letetrs.split("").reverse().join("")}}</div>
<!-- 属性绑定 -->
<div :class="className"></div>
</template>
提示:如果你希望绑定响应式数据,则需要使用
ref
或reactive
包裹。
三、指令、参数、修饰符
这里主要介绍三者的概念,具体指令及参数和修饰符,会在后续的示例中提现:
1)指令:带有 v-
前缀的特殊属性。
2)参数:在指令后以冒号指明。
3)修饰符:是以.
指明的特殊后缀,用于指出特殊何种方式绑定
<div v-bind:class="className"></div>
<input type="text" v-model.number="num">
<button type="button" v-on:click="login">登录</button>
上述示例中:
- 指令:
v-bind
(动态绑定属性) /v-model
(数据双向绑定) /v-on
(绑定事件) - 参数:
:class
(表示绑定class
属性) /:click
(表示绑定click
事件) 修饰符
:.number
(表示将输入框的值转换成number
类型)
四、用户输入
在 input
输入框中我们可以使用 v-model
指令来实现双向数据绑定:
<script setup lang="ts">
import { ref } from 'vue';
// state
const inputValue = ref('');
// events
const onButtonTap = () => {
inputValue.value = "I'm studing!";
};
</script>
<template>
<div style="margin: 10px 0;">Enter Content:{{ inputValue }}</div>
<!-- 通过 v-model 指令实现双向绑定 -->
<!-- 1)更新inputValue 的值刷新视图 -->
<!-- 2)在输入框输入内容,更新 inputValue -->
<button type="button" @click="onButtonTap" style="margin-right: 10px;">手动修改 inputValue</button>
<input type="text" v-model="inputValue" placeholder="请输入文本" />
</template>
示例如下:
五、绑定事件
v-on
指令可以绑定事件监听器:
<script setup lang="ts">
// 事件处理函数
const onButtonTap = () => {
console.log('The button tag is clicked!');
};
</script>
<template>
<button type="button" @click="onButtonTap">Tap Me.</button>
</template>
提示:事件处理的更多知识点请查看 《事件处理器章节》
六、缩写
Vue 为两个最为常用的指令提供了特别的缩写:
1、v-bind
v-bind
指令允许使用 :
替代,后面跟具体绑定的属性名,如下所示:
<!-- 完整语法 -->
<a v-bind:href="url"></a>
<!-- 缩写 -->
<a :href="url"></a>
2、v-on
v-on
指令允许使用 @
替代,后面跟具体的事件名,如下所示:
<!-- 完整语法 -->
<a v-on:click="doSomething"></a>
<!-- 缩写 -->
<a @click="doSomething"></a>
七、模板编译原理
- 第一步:将 模板字符串 转换成 element ASTs(解析器)
- 第二步:对 AST 进行静态节点标记,主要用来做虚拟DOM的渲染优化(优化器)
- 第三步:使用 element ASTs 生成 render 函数代码字符串(代码生成器)