何为Vue指令?
带有【v-】这一前缀的特殊【属性】,不同属性【对应】不同的功能
常用Vue指令
v-html
语法:v-html=“表达式”
用途:动态设置元素 innerHTML
案例
<div id="app">
<div v-html="msg"></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: {
msg: `
<a href="https://www.bilibili.com">
哔哩哔哩
</a>
`
}
})
</script>
结果展示
v-show
语法:v-show = “表达式” 表达式值 true表示显示,false表示隐藏
作用:控制元素显示隐藏
底层原理
切换 css 的 display: none 来控制显示隐藏
应用场景:频繁进行切换显示隐藏的地方
案例
<div id="app">
<div v-show="msg">v-show盒子</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: {
msg: true //true表示显示
}
})
</script>
结果展示
<div id="app">
<div v-show="msg">v-show盒子</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: {
msg: false //false表示隐藏
}
})
</script>
结果展示
v-if
语法:v-if = “表达式” 表达式值 true表示存在,false表示不存在
作用:控制元素存在与否
底层原理
根据 判断条件 控制元素的 创建(存在) 和 移除(不存在) 元素节点
应用场景:不频繁进行切换的场景,即:要么存在,要么不存在
案例
<div id="app">
<div v-if="msg">v-if盒子</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: {
msg: true
}
})
</script>
结果展示
<div id="app">
<div v-if="msg">v-if盒子</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: {
msg: false
}
})
</script>
结果展示
v-if v-else-if v-else
作用:进行判断渲染的作用
案例
<div id="app">
<div v-if="gender === 1">性别:男</div>
<div v-else>性别:女</div>
<div v-if="rank === 'A' ">名次A</div>
<div v-else-if="rank === 'B' ">名次B</div>
<div v-else>名次C</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: {
gender: 1,
rank: 'B'
}
})
</script>
结果展示
v-on
用途:事件绑定
语法
完整写法:
1.v-on:事件名="内联语法"
2.v-on:事件名="methods中的函数名"
简写:✔
1.@事件名="内联语法"
2.@事件名="methods中的函数名"
说明
1.事件名:
点击:click
鼠标经过:mouseenter
获得焦点:focus
...
2.this:指的是当前案例
数字加减案例
<div id="app">
<button @click="number--">-</button>
<span>{{ number }}</span>
<button @click="number++">+</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: {
number: 100
}
})
</script>
买东西案例
<div id="app">
<div @click="fun">
<button @click="buy(3)">牛奶3元</button>
<button @click="buy(6)">面包6元</button>
<button @click="buy(4)">巧克力4元</button>
</div>
<div>剩余: {{ money }} 元</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: {
money: 100
},
methods: {
buy(price){
this.money -= price
},
fun(){
alert('恭喜你购买成功')
}
}
})
</script>
v-bind
用途:动态设置html中的标签属性,如src,href,title…
语法
完整写法:
v-bind:属性名="表达式"
简写:✔
:属性名="表达式"
案例
<div id="app">
<button v-show="index > 0" @click="index--">上一页</button>
<img :src="list[index]">
<button v-show="index < list.length-1" @click="index++">下一页</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: {
index: 0,
list: [
'./imgs/01.png',
'./imgs/02.png',
'./imgs/03.jpg'
]
}
})
</script>
v-bind增强练习
京东tab栏
<style>
* {
margin: 0;
padding: 0;
}
ul {
display: flex;
border-bottom: 2px solid #e01222;
padding: 0 10px;
}
li {
width: 100px;
height: 50px;
line-height: 50px;
list-style: none;
text-align: center;
}
li a {
display: block;
text-decoration: none;
font-weight: bold;
color: #333333;
}
li a.active {
background-color: #e01222;
color: #fff;
}
</style>
<div id="app">
<ul>
<li v-for="(item,index) in list" :key="item.id" @click="activeIndex = index">
<a :class="{active: index === activeIndex}" href="#">{{ item.name }}</a>
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
activeIndex: 0, //记录高亮
list: [
{ id: 1, name: '京东秒杀' },
{ id: 2, name: '每日特价' },
{ id: 3, name: '品类秒杀' }
]
}
})
</script>
效果展示
进度条
<style>
.progress {
height: 25px;
width: 400px;
border-radius: 15px;
background-color: #272425;
border: 3px solid #272425;
box-sizing: border-box;
margin-bottom: 30px;
}
.inner {
width: 50%;
height: 20px;
border-radius: 10px;
text-align: right;
position: relative;
background-color: #409eff;
background-size: 20px 20px;
box-sizing: border-box;
transition: all 1s;
}
.inner span {
position: absolute;
right: -20px;
bottom: -25px;
}
</style>
<div id="app">
<!-- 外层盒子底色(黑色) -->
<div class="progress">
<!-- 内部盒子:进度条(蓝色) -->
<div class="inner" :style="{ width: percent + '%' }">
<span>{{ percent }}%</span>
</div>
</div>
<button @click="percent=25">设置25%</button>
<button @click="percent=50">设置50%</button>
<button @click="percent=75">设置75%</button>
<button @click="percent=100">设置100%</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
percent: 0
}
})
</script>
效果展示
v-for
作用:多次渲染整个元素,可以是数组,对象,数字…
语法
v-for="(item,index) in 数组"
注意:item是每一项,index是下标
图书案例
<div id="app">
<h2>图书</h2>
<ul>
<li v-for="(item,index) in list" :key="item.id">
<span>{{ item.name }}</span>
<span>{{ item.author }}</span>
<button @click="del(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: {
list: [
{id:1,name:'《鲁滨逊漂流记》',author: '笛福'},
{id:2,name: '《红楼梦》',author: '曹雪芹'},
{id:3,name: '《西游记》',author: '吴承恩'},
{id:4,name: '《罗密欧与朱丽叶》',author: '莎士比亚'}
]
},
methods: {
del(id){
this.list = this.list.filter(item => item.id !== id)
}
}
})
</script>
结果展示
追加说明:v-for中的key
<li v-for="(item,index) in list" :key="item.id">
<span>{{ item.name }}</span>
<span>{{ item.author }}</span>
<button @click="del(index)">删除</button>
</li>
语法::key=“唯一标识”
**用途:**便于Vue进行列表项的正确排序复用
注意点
1.key只能是 字符串类型 或 数字类型
2.具有唯一性,通常使用 id 作为 key,不推荐index作为key(会发生变化,无法对应)
v-model
语法:v-model=“变量”
作用:可以让数据和视图进行双向数据绑定
何为双向数据绑定?
(1)数据改变,视图自动更新
(2)视图改变,数据自动更新
目的:可以快速【获取】和【设置】表单元素的内容
记事本案例
<!-- 主体区域 -->
<section id="app">
<!-- 输入框 -->
<header class="header">
<h1>记事本</h1>
<input v-model="addName" placeholder="请输入内容" class="new-todo" />
<!-- 添加功能 -->
<button @click="add" class="add">添加内容</button>
</header>
<!-- 列表区域 -->
<section class="main">
<ul class="todo-list">
<li class="todo" v-for="(item,index) in list" :key="item.id">
<div class="view">
<span class="index">{{ index + 1 }}.</span> <label>{{ item.name }}</label>
<!-- 删除功能 -->
<button class="destroy" @click="del(item.id)"></button>
</div>
</li>
</ul>
</section>
<!-- 统计和清空 -> 如果没有任务,底部需要隐藏 -->
<footer class="footer" v-show="list.length > 0">
<!-- 统计 -->
<span class="todo-count">合 计:<strong> {{ list.length }} </strong></span>
<!-- 清空 -->
<button class="clear-completed" @click="clear">
清空任务
</button>
</footer>
</section>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
addName: '',
list: [
{id: 1,name: '跑步五公里'},
{id:2,name:'跳绳100个'}
]
},
methods: {
// 删除功能
del(id){
// 删除功能代码
this.list=this.list.filter(item => item.id !== id)
},
// 添加功能
add(){
// 空内容报错
if(this.addName.trim() === ''){
alert("请输入内容")
return
}
// 添加功能代码
this.list.unshift({
id: +new Date(),
name: this.addName
})
// 内容清空
this.addName = ''
},
// 清空功能
clear(){
this.list=[]
}
}
})
</script>
指令修饰符
(1)按键修饰符
@keyup.enter="表达式" 键盘回车监听
(2)v-model修饰符
v-model.trim="表达式" 去除首位空格
v-model.number="表达式" 转为数字
(3)事件修饰符
@事件名.stop="表达式" 阻止冒泡
@事件名.prevent 阻止默认行为
键盘回车监听案例
<div id="app">
<input @keyup.enter="add" placeholder="请输入内容"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
methods: {
add(){
console.log("监听键盘回车事件")
}
}
})
</script>
v-model修饰符案例
<div id="app">
姓名<input type="text" v-model.trim="username"><br>
年龄<input type="password" v-model.number="age">
</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: '',
age: ''
},
methods: {
add(){
console.log("监听键盘回车事件")
}
}
})
</script>
阻止冒泡案例
若不阻止,点击子盒子时,弹窗会同时弹出“父盒子”。而我们想要的效果是:点击子盒子时,只弹出“子盒子”。因此,代码如下:
<style>
.father{
height: 360px;
width: 360px;
background-color: antiquewhite;
}
.son{
height: 200px;
width: 200px;
background-color: aqua;
}
</style>
<div id="app">
<div class="father" @click="faFn">
<!-- 阻止冒泡 -->
<div class="son" @click.stop="sonFn">son</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
methods: {
faFn(){
alert("父盒子")
},
sonFn(){
alert("子盒子")
}
}
})
</script>
阻止默认行为案例
<div id="app">
<a @click.prevent href="https://www.bilibili.com">哔哩哔哩</a>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app'
})
</script>