vue.js 指令(超级详细带案例版)
单元一 vue.js 指令
学习目标
指令是指带有v-前缀的特殊属性,他们会在Vue实例挂载的DOM元素上应用特殊的响应性行为。常用的指令有:
(1)v-bind
(2)v-on
(3)v-for
(4)v-if
(5)v-else;
(6)v-model
任务一 v - bind指 令
1.1 任务描述
用于动态地绑定一个或多个属性,或者绑定一个组件 prop 到表达式。可以缩写为:。
1.2 任务实施
<div id="app">
<img :src="imageSrc" :alt="imageAlt">
</div>
<script>
var app = new Vue({
el: '#app',
data: {
imageSrc: 'https:/照片链接 ',
imageAlt: '示例图片'
}
});
任务二 v - on 指令
2.1任务描述
用于监听 DOM 事件,并在触发事件时执行JS 代码,可以缩写为@。
2.2 任务实施
<div id="app">
<input type="button" value="事件绑定" @click="todo"> //单击
<input type="button" value="事件绑定" @mouseenter="todo"> //移入
<input type="button" value="事件绑定" @dblclick="todo">//双击
</div>
<script>
var app = new Vue({
el:"#app",
data:{
name:'周杰伦'
},
methods:{
todo:function() {
alert('歌手:'+this.name)
}
}
})
</script>
事件绑定
这里在视频里就能看出来他的监听作用,和我们在前面学过的监听事件是差不多原理的。
任务三 v – for指令
3.1任务描述
用于基于一个数组或者对象来循环渲染一个元素或一组元素
在JS中一般使用for循环,使用i++把整个数组渲染出来,而Vue则是简化一下这个方法,相当于将item变成一个变量。自动实行item++操作;也就是接口已经写好了,自动将数组里面的值赋给变量item
3.2 任务实施
<div id="app">
<div v-for="(item,index) in list" data-id=“index">
索引是:{{index}},元素内容是:{{item}}
</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
list: [1, 2, 3]
}
})
</script>

除了对数组进行迭代外,v-for 还可以对对象进行迭代。在对象迭代中,可以使用 v-for 指令中的第二个和第三个参数 key 和 value 来获取当前迭代的键和值。
<h3>sɪᴅɪᴏᴛ 的自我介绍:</h3>
<div id="app">
<ul>
<li v-for="(value, key) in person">
{{ key }} - {{ value }}
</li>
</ul>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
items: ['唱', '跳', 'rap', '篮球'],
person: {
"名字": "sɪᴅɪᴏᴛ",
"年龄": 18,
"爱好": "篮球"
}
}
})
</script>

练习:指令v-for与v-on简单应用(学生列表)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<button @click="add">添加</button>
<button @click="del">删除</button>
<table>
<tr>
<th>班级</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
</tr><tr v-for="item in students">
<td>{{item.grade}}</td>
<td>{{item.name}}</td>
<td>{{item.gender}}</td>
<td>{{item.age}}</td>
</tr>
</table>
</div>
<script>
var vm=new Vue({
el:'#app',
data:{
students:[]
},
methods:{
add(){
var student={
grade:'1',
name:'张三',
gender:'男',
age:20
}
this.students.push(student)
},
del(){
this.students.pop()
}
}
})
</script>
</body>
</html>
运行结果:
列表
任务四 v-if 指令
4.1任务描述
v-if 指令用于条件性地渲染一块内容,例如在其他语言中,学过 if 语句吧,对一个条件进行一个判断,进而做下一步的内容;var a = 2 ; if ( a > 1 ) { console.log( ''显示内容" ); } ,a>1,那么控制台会出现"显示内容",v-if 指令也是在表达式显示为真值的时候才会渲染对应的内容。
4.2 任务实施
<div id="app">
<div v-if="isShow">
显示内容
</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
isShow:false
}
})
</script>
当isShow等于true时,就会在页面内出现“显示内容”;等于false时,页面是空白的。
如果需要渲染很多内容的话,在div里面的写法有很多种
<div v-if="isShow">显示内容</div>
<div v-if="isShow">显示内容</div>
<div v-if="isShow">显示内容</div>
如果显示内容多了需要大量使用 v-if = "isShow",每一个盒子都给到。
<div v-if="isShow">
<div>显示内容</div>
<div>显示内容</div>
<div>显示内容</div>
</div>
虽然只需要一个div标签包裹起来后就可以进行控制,但它会破环原先的UI结构,假设页面当中的样式等代码都已经完成了,但突然加进去一个div标签后我的页面结构就崩掉了
那么这时候就需要用v-if与<template>的结合使用了。
<template v-if="isShow">
<div>显示内容</div>
<div>显示内容</div>
<div>显示内容</div>
</template>
任务五 v- else指令
5.1 任务描述
`v - else`指令必须紧跟在`v - if`或`v - else - if`指令之后,用于在`v - if`条件不成立时渲染对应的元素。
5.2 任务实施
<div id="app">
<p v-if="isLoggedIn">欢迎回来,已登录用户!</p>
<p v-else>请先登录哦。</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
isLoggedIn: false
}
});
</script>
False显示请先登录的文本;true就显示欢迎回来文本。
也可以根据输入框的内容进行判断
<div id="app">
<input type="text" v-model="inputValue">
<p v-if="inputValue.length >= 6">输入的内容长度符合要求。</p>
<p v-else>输入的内容长度不足,请至少输入6个字符哦。</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
inputValue: ""
}
});
</script>
6
v-else 还可以和 v-else-if 一起配合 v-if 构建更复杂的条件判断逻辑
<div id="app">
<div v-if="score >= 90">优秀,成绩等级为A</div>
<div v-else-if="score >= 80">良好,成绩等级为B</div>
<div v-else-if="score >= 60">及格,成绩等级为C</div>
<div v-else>不及格,成绩等级为D</div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
score: 75 //修改分数显示对应的等级
}
});
</script>

任务六 v-model 指令
6.1 任务描述
用于在表单元素(如 <input>、<textarea>、<select>)和组件上创建双向数据绑定。
6.2 任务实施
6.2.1 案例一:列表任务
<div id="app">
<input placeholder="请输入内容" type="text" v-model="title" @keyup.enter="onEnter">
<hr>
<ul>
<!-- 条件渲染 -->
<li v-if="todos.length===0">无任务</li>
<li v-else v-for="item,index in todos" :key="item.id">
<span>{{item.title}}</span>
<span @click="del(index)">删除</span>
</li>
</ul>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
todos: [],
title: ''
},
methods: {
onEnter() {
this.todos.push({
id: Date.now(),
title: this.title
})
this.title = ''
},
del(index) {
// 删除
this.todos.splice(index, 1)
}
}
})
</script>
运行效果:
任务
6.2.2 案例二:全选复选框
<div id="app">
<div>
<input type="checkbox" v-model="checked" @change="onSelected">
<hr>
<ul>
<li>
<input type="checkbox" value="html" @change="selectlesson" v-model="lessons">html
</li>
<li>
<input type="checkbox" value="css" @change="selectlesson" v-model="lessons">css
</li>
<li>
<input type="checkbox" value="js" @change="selectlesson" v-model="lessons">js
</li>
</ul>
<hr>
<div>{{lessons}}</div>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
lessons: [],
checked: false
},
methods: {
onSelected(evt) {
if (evt.target.checked) {
this.lessons = ["js", 'html', 'css']
} else {
this.lessons = []
}
},
selectlesson() {
this.checked = this.lessons.length == 3
}
}
})
</script>
运行结果:
全选
6.2.3 案例三:;下拉单选
<div id="app">
<div>
<h3>{{sex}} -- {{city}}</h3>
<label>
<input type="radio" value="先生" v-model="sex">建行
</label>
<label>
<input type="radio" value="女神" v-model="sex">招行
</label>
</div>
<hr>
<div>
<select v-model="city">
<option value="0">==选择==</option>
<option value="wh">芜湖</option>
<option value="bj">北京</option>
</select>
</div>
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
sex: '先生',
city: '0'
}
})
</script>
运行结果:
建行
6.2.4 v-model修饰符
(1) lazy:延时更新数据源中的数据,失去焦点时触发更新。
(2) trim:自动过滤用户输入的首尾空白字符。
(3) number:输入值转为数值类型。
6.2.5 购物车案例:
<div id="app">
<table border="1" width="600">
<tr>
<th>序号</th>
<th>名称</th>
<th>单价</th>
<th>数量</th>
<th>操作</th>
</tr>
<tr v-for="item,index in carts">
<td>{{index+1}}</td>
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>
<button @click="setNum(1,index)">+++</button>
<input type="number" v-model="item.num">
<!-- <button @click="setNum(-1,item)">---</button> -->
<button @click="setNum(-1,index)">---</button>
</td>
<td>
<button @click="del(index)">删除</button>
</td>
</tr>
</table>
<hr>
<h3>
合计:
{{totalPrice()}}
</h3>
</div>
<script>
function getCarts() {
return !window.localStorage.getItem('carts') ? [{ id: 1, name: '小米12pro', price: 1, num: 1 },
{ id: 2, name: '华为手机', price: 2, num: 1 },
{ id: 3, name: '水果手机', price: 3, num: 1 }] : JSON.parse(window.localStorage.getItem('carts'))
}
function setCarts(carts) {
window.localStorage.setItem('carts', JSON.stringify(carts))
}
const vm = new Vue({
el: '#app',
data: {
carts: getCarts()
},
methods: {
setNum(n, index) {
this.carts[index].num += n
if (this.carts[index].num <= 1) this.carts[index].num = 1
if (this.carts[index].num >= 3) this.carts[index].num = 3
// this.carts[index].num = Math.min(3, Math.max(1, this.carts[index].num))
setCarts(this.carts)
},
totalPrice() {
return this.carts.reduce((prev, { price, num }) => {
prev += price * num
return prev
}, 0)
},
del(index) {
if(confirm('确定删除')){
this.carts.splice(index, 1)
setCarts(this.carts)
}
}
}
})
</script>
运行结果:
购物车
总结
你学会了吗,要学到东西哦

更多推荐
所有评论(0)