1. Vue中的指令
- 指令:模板语法,用于辅助开发者渲染页面的基本结构。
- Vue中的指令按照不同的用途,可以分为如下6大类:
- 内容渲染指令
- 属性绑定指令
- 事件绑定指令
- 双向绑定指令
- 条件渲染指令
- 列表渲染指令
1.1 内容渲染指令(v-text、{{}}、v-html)
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<p v-text="username"></p>
<p>性别:{{gender}}</p>
<div v-html="info"></div>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el : '#app',
// data 对象就是要渲染到页面上的数据
data: {
username: '张三',
gender: '男',
info: '<h4>正在努力学习vue框架</h4></h4>'
}
})
</script>
</body>
</html>
结果:
1.2 属性绑定指令(:/ v-bind)
- 注意:插值表达式只能用在元素的内容节点中,不能用在元素的属性节点中。
- 在vue中,可以使用v-bind指令,为元素的属性动态绑定值,简写为英文的:(冒号)。
- 在使用v-bind属性绑定期间,如果板顶内容需要进行动态拼接,则字符串外边应该包括单引号。
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<input type="text" :placeholder="tips"><br>
<img :src="photo" alt="" style="width: 40px;">
<div :title="'box' + index">这是一个div</div>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el : '#app',
// data 对象就是要渲染到页面上的数据
data: {
tips:'请输入用户名',
photo: 'https://cn.vuejs.org/images/logo.svg',
index: 1,
}
})
</script>
</body>
</html>
结果:
1.3 事件绑定指令(@ / v-on)
- 可以简写为@;
- 事件绑定的处理函数,写在methods里;
- 函数可以传参,写在函数后面的小括号里;
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<p>count的值为:{{count}}</p>
<button v-on:click="add(1)">+1</button>
<button @click="sub">-1</button>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el : '#app',
// data 对象就是要渲染到页面上的数据
data: {
count: 0,
},
methods: {
add(n) {
console.log(vm);
this.count+=n;
},
sub() {
this.count--;
}
}
})
</script>
</body>
</html>
效果:
1.3.1 事件绑定中的$event
- vue 提供了内置变量,名字叫做$event,它就是原生DOM的事件对象。
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<p>count的值为:{{count}}</p>
<button v-on:click="add(1, $event)">+1</button>
<button @click="sub">-1</button>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el : '#app',
// data 对象就是要渲染到页面上的数据
data: {
count: 0,
},
methods: {
add(n, e) {
console.log(e);
this.count+=n;
// 判断 count 的值
if(this.count % 2 === 0) {
// 偶数
e.target.style.backgroundColor = 'pink';
} else {
// 奇数
e.target.style.backgroundColor = '';
}
},
sub() {
this.count--;
}
}
})
</script>
</body>
</html>
结果:
奇数时,button为原色;偶数时,button为粉色。
1.3.1 事件修饰符
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<a href="https://www.baidu.com/" @click.prevent="show">跳转到百度首页</a>
<div style="background-color: pink; width:500px; height: 200px; line-height:200px; padding: 150px;" @click="divHandler">
<button @click.stop="btnHandler">按钮</button>
</div>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el : '#app',
// data 对象就是要渲染到页面上的数据
data: {
count: 0,
},
methods: {
show() {
console.log('阻止了a的默认跳转事件!');
},
btnHandler() {
console.log('btnHandler');
},
divHandler() {
console.log('divHandler');
}
}
})
</script>
</body>
</html>
结果:
1.3.3 按键修饰符
代码:
- 下面这段代码实现的是,在input中输入内容,按下esc清空内容,按下回车,打印内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<input type="text" @keyup.esc="clearInput" @keyup.enter="submitInput">
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el : '#app',
// data 对象就是要渲染到页面上的数据
data: {
count: 0,
},
methods: {
clearInput(e) {
console.log('触发了clearInput方法');
e.target.value = '';
},
submitInput() {
console.log('触发了submitInput方法');
}
}
})
</script>
</body>
</html>
1.4 双向数据绑定指令(v-model)
- v-model和v-bind的区别,前者是双向数据绑定,后者是单向数据绑定(响应data中的数据变化,动态渲染视图);
- v-model可以用在input、textarea、select中。
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<p>用户的名字是:{{username}}</p>
<!-- 双向数据绑定 -->
<input type="text" v-model="username">
<hr>
<!-- 单项数据绑定 -->
<input :value="username"></input>
<hr>
<!-- 下拉选择框 -->
<select v-model="city">
<option value="">请选择城市</option>
<option value="1">北京</option>
<option value="2">上海</option>
<option value="3">吉林</option>
</select>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el : '#app',
// data 对象就是要渲染到页面上的数据
data: {
username: '张三1',
city: 1,
},
})
</script>
</body>
</html>
结果:
1.4.1 v-model的修饰符
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<input type="text" v-model.number="n1" />+
<input type="text" v-model.number="n2" />=
<span>{{n1 + n2}}</span>
<hr>
<!-- 去除字符串前后空格 -->
<input type="text" v-model.trim="username">
<button @click="showName()">获取用户名</button>
<hr>
<input type="text" v-model.lazy="username">
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el: "#app",
// data 对象就是要渲染到页面上的数据
data: {
username: "张三1",
city: 1,
n1: 1,
n2: 3,
},
methods: {
showName() {
console.log(`用户名为:'${this.username}'`);
}
}
});
</script>
</body>
</html>
结果:
1.5 条件渲染指令(v-if、v-show)
- v-model的原理是:动态为元素添加或者移除 display:none;样式,来实现元素的显示和隐藏;
- 如果要频繁地切换元素的显示状态,用v-show性能更好;
- v-if的原理是:每次动态创建或者移除元素,实现元素的显示与隐藏;
- 如果刚进入页面,某个元素默认不需要被展示,而且后期这个元素很可能也不需要被展示出来,此时v-if性能更好。
- 在实际开发中,绝大多数情况,不用考虑性能问题,直接使用v-if。
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<p v-if="flag">这是v-if控制的</p>
<p v-show="flag">这是v-show控制的</p>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el: "#app",
// data 对象就是要渲染到页面上的数据
data: {
flag: true,
},
});
</script>
</body>
</html>
1.5.1 v-if经常与v-else-if、v-else搭配使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<div v-if="type === 'A'">优秀</div>
<div v-else-if="type === 'B'">良好</div>
<div v-else-if="type === 'C'">及格</div>
<div v-else="type === 'D'">差</div>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el: "#app",
// data 对象就是要渲染到页面上的数据
data: {
type: 'B',
},
});
</script>
</body>
</html>
上面这段代码实现的功能:根据type的值,决定显示优秀、良好、及格、差。
1.6 循环渲染指令(v-for)
代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
<div id="app">
<table>
<thead>
<th>索引</th>
<th>Id</th>
<th>名字</th>
</thead>
<tbody>
<tr v-for="(item,index) in list" :title="item.name + index">
<td>{{index}}</td>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
</tr>
</tbody>
</table>
</div>
<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="/lib/vue.js"></script>
<!-- 2. 创建 Vue 实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
el: "#app",
// data 对象就是要渲染到页面上的数据
data: {
list: [
{ id: 1, name: "刘能" },
{ id: 2, name: "赵四" },
{ id: 3, name: "谢广坤" },
],
},
});
</script>
</body>
</html>
结果:
1.6.1 绑定:key属性
- 官方建议,只要用到v-for指令,那么一定要绑定一个:key属性,而且尽量把id作为key的值。
- 官方对key的值类型,要求是字符串或数字类型。
key的注意事项
参考:黑马Vue视频