Vue 指令
概念:指令是 Vue 提供的带有 v- 前缀的特殊标签属性。
Vue 会根据不同的指令,针对标签实现不同的功能,提高操作 DOM 的效率
1 2
| <div v-html="str"></div>
|
vue 中的指令按照不同的用途可以分为如下 6 大类:
- 内容渲染指令(v-html、v-text)
- 条件渲染指令(v-show、v-if、v-else、v-else-if)
- 事件绑定指令(v-on)
- 属性绑定指令 (v-bind)
- 双向绑定指令(v-model)
- 列表渲染指令(v-for)
内容渲染指令
内容渲染指令用来辅助开发者渲染 DOM 元素的文本内容。
常用的内容渲染指令有如下2 个:
v-text(类似innerText):
- 使用语法:
<p v-text="uname">hello</p>
,意思是将 uame 值渲染到 p 标签中
- 类似 innerText,使用该语法,会覆盖 p 标签原有内容
v-html(类似 innerHTML):
- 使用语法:
<p v-html="intro">hello</p>
,意思是将 intro 值渲染到 p 标签中
- 类似 innerHTML,使用该语法,会覆盖 p 标签原有内容
- 类似 innerHTML,使用该语法,能够将HTML标签的样式呈现出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div id="app"> <h2>登录信息</h2> <p v-text="uname">用户名:</p> <p v-html="intro">简介:</p> </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script> const app = new Vue({ el:'#app', data: { uname: 'Alien', intro: '<h2>一个<strong>来自M78</strong>的程序员</h2>' } }) </script>
|
条件渲染指令
条件判断指令,用来辅助开发者按需控制 DOM 的显示与隐藏。
v-show:
- 作用: 控制元素显示隐藏
- 语法:
v-show = "表达式"
表达式值 true 显示, false 隐藏
- 原理: 切换
display:none
控制显示隐藏
- 场景: 频繁切换显示隐藏的场景
v-if:
- 作用: 控制元素显示隐藏(条件渲染)
- 语法:
v-if = "表达式"
表达式值 true 显示, false 隐藏
- 原理: 基于条件判断,是否创建或移除元素节点
- 场景: 要么显示,要么隐藏,不频繁切换的场景
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <div id="app"> <h2>登录信息</h2> <p v-text="uname" v-show="flag">用户名:</p> <p v-html="intro" v-if="flag">简介:</p> </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script> const app = new Vue({ el:'#app', data: { uname: 'Alien', intro: '<h2>一个<strong>来自M78</strong>的程序员</h2>', flag: false } }) </script>
|
v-else&v-else-if:
- 作用: 辅助 v-if 进行判断渲染
- 语法:
v-else
、v-else-if = "表达式"
- 注意: 需要紧挨着 v-if 一起使
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <div id="app"> <p v-if="score >= 90">优秀</p> <p v-else-if="score >= 60">一般</p> <p v-else>差劲</p> </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script> const app = new Vue({ el:'#app', data: { score: 85 } }) </script>
|
事件绑定指令
事件绑定指令是用来注册DOM事件的
作用: 注册事件
语法:
v-on:事件名 = "内联语句"
v-on:事件名 = "methods中的函数名"
v-on
简写:@事件名
内联语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <div id="app"> <button @click="count--">-</button> <span>{{ count }}</span> <button @click="count++">+</button> </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script> const app = new Vue({ el: '#app', data: { count: 100 } }) </script>
|
methods中的函数名:
- 事件处理函数应该写到一个跟data同级的配置项
methods
中
methods
中的函数内部的this都指向Vue实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <div id="app"> <button @click="fn">开关</button> <button @click="fn2(-10)">-10</button> <button @click="fn2(10)">+10</button> <div v-show="flag"> <button @click="count--">-</button> <span>{{ count }}</span> <button @click="count++">+</button> </div> </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script> const app = new Vue({ el: '#app', data: { count: 100, flag: true }, methods: { fn() { app.flag = !app.flag }, fn2(a) { this.count += a } } }) </script>
|
属性绑定指令
- 作用: 动态的设置html的标签属性,比如:src、url、title
- 语法:
v-bind:属性名="表达式"
- 注意: 简写形式
:属性名="表达式"
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <div id="app"> <img :src="url" alt=""> </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script> const app = new Vue({ el: '#app', data: { url: '图片路径' } }) </script>
|
操作class
语法: :class = "对象/数组"
- 对象 → 键就是类名,值是布尔值。如果值为 true,有这个类,否则没有这个类
1
| <div class="box" :class="{ 类名1: 布尔值, 类名2: 布尔值 }"></div>
|
适用场景:一个类名,来回切换
- 数组 → 数组中所有的类,都会添加到盒子上,本质就是一个 class 列表 v-bind 对于样式控制的增强 - 操作class
1
| <div class="box" :class="[ 类名1, 类名2, 类名3 ]"></div>
|
适用场景:批量添加或删除类
操作style
语法::style = "样式对象"
1
| <div class="box" :style="{ CSS属性名1: CSS属性值, CSS属性名2: CSS属性值 }"></div>
|
适用场景:某个具体属性的动态设置
列表渲染指令
列表渲染指令 v-for ,用来辅助开发者基于一个数组来循环渲染一个列表结构。
v-for 指令: v-for="(item, index) in arr"
- item 是数组中的每一项
- index 是每一项的索引,不需要可以省略
- arr 是被遍历的数组
此语法可以遍历数组、对象和数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <div id="app"> <h2>忍者村首领</h2> <ul> <li v-for="(item, index) in boss" :key="item.id"> <span>{{ item.village }}</span> <span>{{ item.name }}</span> <button @click=fn(item.id)>删除</button> </li> </ul> </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script> const app = new Vue({ el: '#app', data: { boss: [ {id: 1, village: '木叶村火影', name: '纲手'}, {id: 2, village: '砂隐村风影', name: '我爱罗'}, {id: 3, village: '雾隐村水影', name: '照美冥'}, {id: 4, village: '云隐村雷影', name: '艾'}, {id: 5, village: '岩隐村土影', name: '打野木'} ] }, methods: { fn(id) { this.boss = this.boss.filter(item => item.id !== id) } } }) </script>
|
v-for 中的 key:
语法: key="唯一值"
作用:给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用。
v-for 的默认行为会尝试原地修改元素(就地复用),只是将元素内容修改,还保留原来的元素
双向绑定指令
所谓双向绑定就是:
- 数据改变后,呈现的页面结果会更新
- 页面结果更新后,数据也会随之而变
作用:给 表单元素 使用, 双向数据绑定
- 数据变化 → 视图自动更新
- 视图变化 → 数据自动更新
语法:v-model = '变量'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <div id="app"> 用户:<input type="text" v-model="username"> <br><br> 密码:<input type="password" v-model="password"> <br><br> <button @click="clear">登录</button> <button @click="clear">重置</button> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { username: '', password: '' }, methods: { clear(){ this.username = '', this.password = '' } } }) </script>
|
应用于其他表单元素
常见的表单元素都可以用 v-model 绑定关联 → 快速 获取 或 设置 表单元素的值
它会根据 控件类型 自动选取 正确的方法 来更新元素
输入框 input:text ——> value
文本域 textarea ——> value
复选框 input:checkbox ——> checked
单选框 input:radio ——> checked
下拉菜单 select ——> value
…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| <div id="app"> <h3>小黑学习网</h3> 姓名: <input type="text" v-model="name"> <br><br> 是否单身: <input type="checkbox" v-model="isSingle"> <br><br> 性别: <input type="radio" value="1" v-model="gender">男 <input type="radio" value="2" v-model="gender">女 <br><br> 所在城市: <select v-model="city"> <option value="101">北京</option> <option value="102">上海</option> <option value="103">成都</option> <option value="104">南京</option> </select> <br><br> 自我描述: <textarea v-model="desc"></textarea> <button>立即注册</button> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { name: '', isSingle: false, gender: 1, city: '101', desc: '' } }) </script>
|
指令修饰符
通过 "."
指明一些指令后缀,不同后缀封装了不同的处理操作 → 简化代码
- 按键修饰符
@keyup.enter
→ 键盘回车监听
- v-model修饰符
v-model.trim
→ 去除首尾空格
v-model.number
→ 转成数字
- 事件修饰符
@事件名.stop
→ 阻止冒泡
@事件名.prevent
→ 阻止默认行为
@事件名.stop.prevent
→ 可以连用 即阻止事件冒泡也阻止默认行为
1 2 3 4 5 6 7
| <div id="app"> 用户:<input type="text" v-model.trim="username" @keyup.enter="clear"> <br><br> 密码:<input type="password" v-model.trim.number="password"> <br><br> <button @click="clear">登录</button> <button @click="clear">重置</button> </div>
|