文章目录
第2章 Vue事件绑定的使用
2.1 Vue基本使用
Vue.js 是一个用于构建用户界面的渐进式JavaScript框架。它提供了一套声明式的渲染数据到DOM的系统(其底层依赖于Vue提供的VM组件),以及组件化的开发模式。Vue.js 通过指令来扩展HTML的功能,使得开发者能够以声明式的方式将DOM的绑定至底层Vue实例的数据上。
2.1.1 插值表达式
Vue.js 中的插值表达式是一种简洁的方式,用来在模板中显示数据模型的变化。最常用的插值表达式是双大括号 {{ }},它可以插入数据模型中变量的值。
- 使用示例:
当在模板中使用双大括号 {{ }} 包裹一段表达式时,Vue 会计算这段表达式的值,并将其转换为字符串然后插入到 DOM 中。例如:
<span>{{ message }}</span>
如果 Vue 实例的数据(data)中有 message 属性,那么该属性的值将被渲染到页面上。
插值表达式中可以包含任何有效的 JavaScript 表达式,包括变量引用、字符串连接、算术运算等。
例如:
<p>{{ firstName + ' ' + lastName }}</p>
<p>{{ 1 + 2 }}</p>
<p>{{ ok ? 'YES' : 'NO' }}</p>
小练习:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<!-- 准备一个容器 -->
<div id="box">
<h3>number:{{number}}</h3>
<h3>message:{{message}}</h3>
<h3>flag:{{flag}}</h3>
<h3>car:{{car}}</h3>
<h3>season:{{season}}</h3>
</div>
</body>
<script type="text/javascript">
// 是否开启devtools调试工具(开发版本默认为true,生产版本默认为false)
Vue.config.devtools = true;
new Vue({ // 创建一个Vue实例
el: "#box", // 通过id选择器选择某个控件(代码Vue接管这片区域)
data: { // Vue中存放数据的地方(Model)
number: 100,
message: "Hello Vue!",
flag: true,
car: {
brand: "长安汽车",
name: "长安CS95",
price: 158000
},
season: ["Spring", "Summer", "Autumn", "Winter"]
}
})
</script>
</html>
2.1.2 注意事项
一个Vue只能绑定一个组件,即使选择器可以选择多个组件,那么也不会生效;
<body>
<div class="box">
{{msg}}
</div>
<div class="box">
{{msg}}
</div>
<script type="text/javascript">
new Vue({
el: ".box", // 通过class选择器选择组件
data: {
msg:"Hello Vue!"
}
})
</script>
</body>
当然,我们也可以创建多个Vue实例来接管多个组件。
<body>
<div id="box1">
{{msg}}
</div>
<div id="box2">
{{msg}}
</div>
<script type="text/javascript">
new Vue({
el: "#box1", // 通过class选择器选择组件
data: {
msg:"Hello Vue!"
}
})
new Vue({
el: "#box2", // 通过class选择器选择组件
data: {
msg:"Hello Vue!"
}
})
</script>
</body>
2.2 Vue事件绑定
在Vue中提供 v-on 命令用于监听 DOM 事件,并在事件触发时执行一些 JavaScript 代码。它可以在 Vue 模板中被用来响应用户操作,如点击按钮、输入文本等。可以直接在 HTML 元素上使用 v-on 指令来绑定一个事件监听器到这个元素上的某个事件上。最简单的形式是将一个方法名(字符串)作为表达式传入 v-on 指令。
- 示例代码:
<button v-on:click="doSomething">点击我</button>
当用户点击按钮时,将会调用 Vue 实例中的 methods 属性里定义的 doSomething 方法。
- 简写方式:
为了简化书写,Vue 还提供了一个简短的语法来代替完整的 v-on 写法。只需要使用 @ 符号加上事件名即可。
<button @click="doSomething">点击我</button>
vue提供的事件非常多,几乎支持所有的原生JS事件,采用v-on:的方式监听。常用的Vue事件如下。
事件类型 | 描述 |
---|---|
click | 当用户点击鼠标按钮时调用。 |
dblclick | 当用户双击鼠标按钮时调用。 |
mousedown | 当用户按下鼠标按钮时调用。 |
mouseup | 当用户释放鼠标按钮时调用。 |
mouseover | 当用户将鼠标指针移到元素上时调用。 |
mouseout | 当用户将鼠标指针从元素或其子元素移开时调用。 |
mouseenter | 当用户将鼠标指针移到元素上时调用(不包括子元素)。 |
mouseleave | 当用户将鼠标指针从元素或其子元素移开时调用。 |
contextmenu | 当用户右击(或执行类似操作)来打开上下文菜单时调用。 |
keydown | 当用户按下键盘上的键时调用。 |
keypress | 当用户按下一个或多个键并且产生字符值时调用。 |
keyup | 当用户释放键盘上的键时调用。 |
submit | 当表单提交时调用。 |
focus | 当元素获得焦点时调用。 |
blur | 当元素失去焦点时调用。 |
change | 当域的内容被改变时调用。 |
input | 每当输入字段发生变化时调用。 |
reset | 当表单被重置时调用。 |
select | 当用户选择一些文本或更改了对象的选择时调用。 |
touchstart | 触摸开始时调用。 |
touchmove | 触摸移动时调用。 |
touchend | 触摸结束时调用。 |
touchcancel | 触摸被中断时调用。 |
2.1.1 点击事件
点击事件分为单机事件与双击事件,在Vue中分别采用click和dbclick来监听。
- v-on:click:单机事件。
- v-dbclick:双击事件。
示例代码:
<body>
<div id="box">
<h3>单击事件</h3>
<p><a href="http://www.baidu.com" v-on:click="fun1">我是按钮1</a></p>
<p><a href="http://www.baidu.com" v-on:click="fun2('hello')">我是按钮2</a></p>
<p><a href="http://www.baidu.com" v-on:click="fun3">我是按钮3</a></p>
<!-- v-on: 可以简写成@ -->
<!-- 如果event参数在后面,则必须显示的传递 -->
<p><a href="http://www.baidu.com" @click="fun4('hello',$event)">我是按钮4</a></p>
<h3>双击事件</h3>
<p>
<button v-on:dblclick="fun5">双击事件</button>
</p>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {
},
methods:{
fun1:function(){
alert(1)
},
fun2:function(msg){
alert(msg)
},
fun3:function(event){ // Vue中定义的方法默认会传递一个event事件
alert(event)
event.preventDefault(); // 阻止事件的默认行为(跳转页面)
},
fun4:function(msg,event){
alert(msg);
alert(event);
},
fun5:function(){
alert("双击事件!")
}
}
})
</script>
</body>
2.2.2 键盘事件
v-on:keydown
:鼠标按下事件v-on:keyup
:鼠标抬起事件
示例代码:
<body>
<div id="box">
<input type="text" v-on:keydown="down"><br> <!-- 键盘按下事件 -->
<input type="text" v-on:keyup="up"> <!-- 键盘抬起事件 -->
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
down() { // 简写方式
console.log("键盘按下了")
},
up(){
console.log("键盘抬起了")
}
}
})
</script>
</body>
2.2.3 移动事件
v-on:mouseover
:鼠标移入事件v-on:mouseout
:鼠标移出事件
示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box" style="width: 300px;height: 200px;background-color: gray;"
v-on:mousemove="inter" v-on:mouseout="outer">
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
inter(){
console.log("鼠标移入了")
},
outer(){
console.log("鼠标移出了")
}
}
})
</script>
</body>
</html>
2.3 按键修饰符
2.3.1 默认的按键修饰符
当进行键盘事件的监听时,我们可以通过event事件中的keyCode或者key来判断按下的是哪一个键,从而进行针对性的处理;同时Vue也为一些常用的按键分配了按键修饰符(相当于别名),这样就可以更加方便的来监听指定的按键,Vue中常用的按键别名如下:
- 回车 => enter
- 删除 => delete(捕获“删除”和“退格”键)
- 退出 => esc
- 空格 => space
- 换行 => tab(没有keyup事件,只有keydown事件)
- 上 => up
- 下 => down
- 左 => left
- 右 => right
示例代码:
<body>
<div id="box">
<p><input type="text" v-on:keyup="fun1"></p>
<p><input type="text" v-on:keyup.enter="fun2">enter</p>
<p><input type="text" v-on:keyup.delete="fun3">delete</p>
<p><input type="text" v-on:keyup.esc="fun4">esc</p>
<p><input type="text" v-on:keydown.tab="fun5">tab</p>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1(event){
console.log(event.keyCode,"---",event.key)
},
fun2(){
console.log("您按下了回车!")
},
fun3(){
console.log("您按下了delete!")
},
fun4(){
console.log("您按下了esc!")
},
fun5(){
console.log("您按下了tab!")
}
}
})
</script>
</body>
2.3.2 自定义按键修饰符
针对于Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为短横线命名;
例如:CapsLock—>caps-lock
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box">
<p><input type="text" v-on:keyup="fun1"></p>
<p><input type="text" v-on:keyup.Control="fun2">ctrl</p>
<!-- 注意需要【短横线命名】-->
<p><input type="text" v-on:keyup.caps-lock="fun3">CapsLock</p>
<p><input type="text" v-on:keyup.delete="fun4">delete</p>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1(event) {
console.log(event.keyCode, "---", event.key)
},
fun2() {
console.log("您按下了ctrl!")
},
fun3() {
console.log("您按下了CapsLock!")
},
fun4() {
console.log("您按下了delete或backspace键!")
}
}
})
</script>
</body>
</html>
2.3.3 自定义按键修饰符注意事项
Vue自定义的按键修饰符修饰系统修饰键(用法特殊)时:(ctrl、alt、shift、meta),其中ctrl键除外;
- 配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。
- 配合keydown使用:正常触发事件。
另外,例如某些键监听不了;因此我们一般都使用Vue自身提供的按键修饰符或者采用keyCode/key来判断用户按下的键;
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box">
<p><input type="text" v-on:keyup="fun1"></p>
<p><input type="text" v-on:keyup.Control="fun2">ctrl</p>
<p><input type="text" v-on:keyup.Alt="fun3">alt</p> <!-- 监听keyup时需要按其他键才能触发事件 -->
<p><input type="text" v-on:keyup.Shift="fun4">shift</p> <!-- 监听keyup时需要按其他键才能触发事件 -->
<p><input type="text" v-on:keyup.Meta="fun5">meta</p> <!-- 监听keyup时需要按其他键才能触发事件 -->
<p><input type="text" v-on:keydown.0="fun6">0</p> <!-- 只能监听数字0 -->
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1(event){
console.log(event.keyCode,"---",event.key)
},
fun2(){
console.log("您按下了ctrl!")
},
fun3(){
console.log("您按下了alt!")
},
fun4(){
console.log("您按下了shift!")
},
fun5(){
console.log("您按下了windows!")
},
fun6(){
console.log("您按下了数字0!")
}
}
})
</script>
</body>
</html>
2.3.4 自定义别名
Vue支持根据keyCode来扩展自定义的按键,扩展的自定义按键解决了系统按键需要搭配其他键才能触发的问题(也有部分按键可能会有问题)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box">
<p><input type="text" v-on:keyup="fun1"></p>
<p><input type="text" v-on:keyup.huiche="fun2">回车</p>
<p><input type="text" v-on:keyup.kongge="fun3">空格</p>
<p><input type="text" v-on:keyup.windows="fun4">windows</p>
</div>
<script type="text/javascript">
Vue.config.keyCodes.huiche = 13
Vue.config.keyCodes.kongge = 32
Vue.config.keyCodes.windows = 91
new Vue({
el: "#box",
data: {},
methods: {
fun1(event){
console.log(event.keyCode,"---",event.key)
},
fun2(){
console.log("您按下了回车")
},
fun3(){
console.log("您按下了空格!")
},
fun4(){
console.log("您按下了windows!")
}
}
})
</script>
</body>
</html>
2.4 事件修饰符
Vue中提供了简化了很多JS中的事件修饰符,Vue中的事件修饰符如下:
事件 | 说明 |
---|---|
prevent | 阻止默认事件; |
stop | 阻止事件冒泡; |
capture | 使用事件的捕获模式; |
once | 事件只触发一次; |
self | 只有event.target是当前操作的元素时才触发事件; |
passive | 事件的默认行为立即执行,无需等待事件回调执行完毕; |
left (2.2.0) | 只当点击鼠标左键时触发。 |
right(2.2.0) | 只当点击鼠标右键时触发。 |
middle(2.2.0) | 只当点击鼠标中键时触发。 |
(1)阻止默认事件。
<body>
<div id="box">
<!--a标签的默认事件被阻止了,所以不会进行链接跳转-->
<h3>阻止默认事件</h3>
<p><a href="http://www.baidu.com" v-on:click.prevent="fun1">百度一下</a></p>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1() {
alert("Hello Baidu")
}
}
})
</script>
</body>
(2)阻止冒泡事件。
<body>
<div id="box">
<!-- 先点击到blue,然后向上传递给上层的空间(red)-->
<h3>未阻止冒泡事件</h3>
<div v-on:click="fun1" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click="fun2" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
<!--只有blue被触发时间了,不会向上传递事件,red不会触发点击事件-->
<h3>阻止冒泡事件</h3>
<div v-on:click="fun1" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click.stop="fun2" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1() {
console.log("red")
},
fun2() {
console.log("blue")
}
}
})
</script>
</body>
(3)事件捕捉。
<body>
<div id="box">
<!--先blue(先捕捉到),再red-->
<h3>未进行事件捕捉</h3>
<div v-on:click="fun1" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click="fun2" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
<!--先bred(先捕捉到),再blue-->
<h3>进行了事件捕捉</h3>
<div v-on:click.capture="fun1" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click="fun2" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1() {
console.log("red")
},
fun2() {
console.log("blue")
}
}
})
</script>
</body>
(4)self修饰符。
<body>
<div id="box">
<!-- 默认情况下,点击了blue事件会进行冒泡传递给red,但是用户并非实际点击red,而是冒泡传递过去的 -->
<h5>没有使用self修饰符</h5>
<div v-on:click="fun1" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click="fun2" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
<h5>使用了self修饰符</h5>
<!-- 只有真正的点击自己时才触发事件,不接收冒泡传递过来的事件 -->
<div v-on:click.self="fun1" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click="fun2" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1(event) {
console.log(event.target)
},
fun2(event) {
console.log(event.target)
}
}
})
</script>
</body>
(6)左、右、中键点击事件。
<body>
<div id="box">
<h3>单击事件</h3>
<button v-on:click.left="fun1">单击左键</button>
<button v-on:click.right="fun2">单击右键</button>
<button v-on:click.middle="fun3">单击中键</button>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1() {
console.log("您点击了左键")
},
fun2(event) {
console.log("您点击了右键")
event.preventDefault() //阻止默认事件(浏览器右键菜单)
},
fun3() {
console.log("您点击了中键")
}
}
})
</script>
</body>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
<style>
li {
height: 100px;
}
</style>
</head>
<body style="height: 1000px;">
<div id="box">
<h3>阻止默认事件</h3>
<p><a href="http://www.baidu.com" v-on:click.prevent="fun1">百度一下</a></p>
<h3>阻止事件冒泡</h3>
<div v-on:click="fun2" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click.stop="fun3" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
<h3>只触发一次事件</h3>
<p>
<button v-on:click.once="fun4">我是按钮</button>
</p>
<h5>事件捕获</h5>
<!--
默认情况下,先进行事件冒泡,再进行事件捕获
capture: 先进行事件捕获,在进行事件冒泡
-->
<div v-on:click.capture="fun5('red')" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click="fun6('blue')" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
<h5>self修饰符</h5>
<!-- 只有真正的点击自己时才触发事件(冒泡不能触发事件) -->
<div v-on:click.self="fun7" style="width: 150px;height: 150px;background-color: red;">
<div v-on:click="fun8" style="width: 100px;height: 100px;background-color: blue;"></div>
</div>
<h5>passvie</h5>
<!-- 事件的默认行为立即执行,无需等待事件回调执行完毕; -->
<ul v-on:wheel.passvie="fun9" style="width: 200px;height: 200px;background-color: red;overflow: scroll;">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<h5>.left</h5>
<button v-on:click.left="fun10">left</button>
</div>
<script type="text/javascript">
new Vue({
el: "#box",
data: {},
methods: {
fun1() {
alert("Hello Baidu")
},
fun2() {
alert("点击了大的div")
},
fun3() {
alert("点击了小的div")
},
fun4() {
console.log("按钮点击了")
},
fun5(color) {
console.log(color)
},
fun6(color) {
console.log(color)
},
fun7(event) {
console.log(event.target)
},
fun8(event) {
console.log(event.target)
},
fun9() {
for (let i = 0; i < 100000; i++) {
console.log('aaa')
}
},
fun10() {
console.log("left")
}
}
})
</script>
</body>
</html>