目录
1. 事件处理
1.1 事件绑定
事件绑定是 Vue 中实现视图和业务逻辑交互的一种方式。将 DOM 元素上的原生事件绑定到 Vue 实例中的方法。当原生事件触发时,Vue 自动调用对应的实例方法。
-
使用
v-on:xxx
或@xxx
绑定事件,xxx
是事件名,同原生DOM
事件名。<button v-on:click="showTel">点我查看学校电话1</button> <button @click="showTel">点我查看学校电话2</button>
第一中是不间写的形式,第二种是简写的形式
2.事件的回调函数,要配置在methods
中(data
中写数据、methods
中写方法)。
3.Vue
在触发事件回调时,会传入一个默认的参数 ——事件对象(event
)
4.methdos
中的函数最终也会出现在vm
上(但不存在数据代理)。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>事件绑定</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器-->
<div id="demo">
<h2>你笑起来真好看</h2>
<button v-on:click="show1">点我查看歌曲</button>
<hr>
<H2>歌曲你的楼兰</H2>
<button @click="show2">我的楼兰</button>
</div>
</body>
<script type="text/javascript">
//阻止 vue 在启动时生成生产提示。
Vue.config.productionTip = false;
const vm = new Vue({
el: "#demo",
data: {
konwlege: "vue"
},
methods: {
show1(event) {
console.log("this");
},
show2: function () {
console.log("你总不小心把倩影挂在月亮上面");
}
}
})
</script>
</html>
1.2 事件传参
-
不传递参数:
@click="test1"
,test1
方法会收到一个event
(事件对象)。 -
传一个参数:
@click="test2(6)"
,test2
方法只会收到一个6
。 -
传多个参数:
@click="test3(6,7,8)"
,test3
方法会收到:6、7、8
。 -
传参+事件对象:
@click="test4(6,$event)"
,test4
方法会收到:事件对象
、6
。
事件传参代码举例:
第一步引入Vue文件
第二步 编写容器
第三部 New vue
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>1-1事件传参</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器-->
<div id="demo">
<button v-on:click="handleClick($event)">Submit</button>
</div>
</body>
<script type="text/javascript">
//阻止 vue 在启动时生成生产提示。
Vue.config.productionTip = false;
new Vue({
el: "#demo",
data: {
sheep: "美羊羊啊",
tel: "18000250000",
},
methods: {
handleClick(event) { // event 是原生 DOM 事件对象
console.log(event.target)
}
}
})
</script>
</html>
5.传递的参数也可以是data
中的数据,例如@click="test5(school)"
。
1.3 事件修饰符
-
prevent
:可以阻止默认行为。 -
stop
:可以阻止冒泡。 -
once
:事件只触发一次。 -
事件修饰符可以串联:
<div @click="test" class="wraper"> <a href="xxx" @click.prevent.stop="test">按钮</a> </div>
事件修饰符代码示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>3-事件修饰符</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
<style>
</style>
</head>
<body>
<!-- 准备好一个容器-->
<div id="demo">
<h2>你炸了{{yanyan}}</h2>
<form action="https://www.baidu.com">
<Button @click.prevent="showInfo">点我显示提示信息</Button>
</div>
</body>
<script type="text/javascript">
//阻止 vue 在启动时生成生产提示。
Vue.config.productionTip = false;
new Vue({
el: "#demo",
data: {
yanyan: "沸羊羊"
},
methods: {
showInfo(event) {
// 阻止冒泡
event.stopPropagation();
alert("是美羊羊炸了");
}
}
})
</script>
</html>
1.4 键盘事件
这里主要讲的是Vue里面的键盘事件,学习的过程容易学了后面,忘记了前面,这里先回顾一下JavaScript里面的键盘事件
1.4.1js键盘事件
可以使用以下方式在 JS 中绑定键盘事件:
element.addEventListener('keyup', (event) => {
// 键盘事件逻辑
})
前端中CSS+JS键盘事件代码示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>键盘事件1-1</title>
<style>
input {
width: 200px;
height: 30px;
border: 1px solid #999;
}
/* 获得焦点时 */
input:focus {
background: #eee;
outline: none;
}
/* 鼠标悬停时 */
input:hover {
border-color: blue;
}
/*元素被激活时鼠标点击或按键按下时 */
input:active {
border: 2px solid red;
}
</style>
</head>
<body>
<input type="text">
<script>
// JS 中绑定键盘事件:
const input = document.querySelector('input')
//在 CSS 中,可以使用以下选择器监听键盘事件:
input.addEventListener('keyup', (event) => {
if (event.key === 'Enter' || event.keyCode === 13) {
console.log('回车键被按下')
} else if (event.ctrlKey && event.key === 's') {
console.log('Ctrl + s 被按下')
}
})
input.addEventListener('click', () => {
console.log('输入框被点击')
})
</script>
</body>
</html>
运行截图中显示,点击输入框的时候,颜色会根据CSS设置的样式变,在控制台中可以看出键盘事件的触发。
1.4.2vue键盘事件
现在这里开始讲vue中的键盘事件
-
Vue
中的按键别名:-
回车 =>
enter
-
删除 =>
delete
(退格 、 删除 按键) -
退出 =>
esc
-
空格 =>
space
-
换行 =>
tab
(必须配合keydown
去使用) -
上 =>
up
-
下 =>
down
-
左 =>
left
-
右 =>
right
-
-
也可以使用
event.keyCode
去指定具体的按键,例如:@keyup.13
绑定回车。 -
有四个系统修饰键,用法比较特殊(了解即可),分别是:
ctrl
、alt
、shift
、meta
,规则如下:-
若配合
keydown
使用:正常触发事件。 -
若配合
keyup
使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。
-
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>4-键盘事件</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<style>
input {
width: 300px;
}
</style>
<body>
<!-- 准备好一个容器-->
<div id="demo">
<h2>你炸了{{yanyan}}</h2>
<!--键盘事件-->
<input @keyup.enter="show" type="text" placeholder="按下回车提示用户输入内容"><br>
</div>
</body>
<script type="text/javascript">
//阻止 vue 在启动时生成生产提示。
Vue.config.productionTip = false;
new Vue({
el: '#demo',
data: {
yanyan: "沸羊羊",
},
methods: {
show(event) {
console.log(event.target.value);
}
}
})
</script>
</html>
2.计算属性案例
这里用到的知识点分析:
1. 使用插值语法 {{hello}} 将 data 中的 hello 值渲染在 h2 标题中。
2. 使用 v-model 双向绑定 input 和 data 中的 firstName 和 lastName。 input 的值变化会更新 data,data 的变化也会更新 input。
3. 定义 fullName 计算属性,在 h2 标题和多个 span 中使用 {{fullName}} 渲染。fullName 计算属性会返回 firstName 和 lastName 的拼接值,并在依赖的 data 变化时重新计算渲染。
4. 定义 methods 中的 add 方法,用于点按钮时使 sum 增加 1。按钮的 @click 绑定了该方法。
5. 在 computed 属性中定义 fullName,它包含一个 get 方法来返回拼接后的全名,这样可以避免每次拼接字符串产生新值,提高性能。
6. 在实例化 Vue 时,使用 el 指定挂载元素,data 指定数据,methods 指定方法,computed 指定计算属性。
代码示范:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>06-计算属性get函数</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器-->
<div id="demo">
<h2>今天也在码前端{{hello}}</h2>
<!-- v-model 双向数据绑定 -->
姓: <input type="text" v-model="firstName"><br>
名:<input type="text" v-model="lastName"><br>
全名:<span>{{fullName}}</span> <br>
全名:<span>{{fullName}}</span> <br>
全名:<span>{{fullName}}</span> <br>
全名:<span>{{fullName}}</span> <br>
全名:<span>{{fullName}}</span> <br>
全名:<span>{{fullName}}</span> <br>
<hr>
<h2>当前求和为:{{sum}}</h2>
<button @click='add'>点我sum+1</button>
<!--写一个计算属性-->
</div>
</body>
<script type="text/javascript">
//阻止 vue 在启动时生成生产提示。
Vue.config.productionTip = false;
const vm = new Vue({
el: '#demo',
data: {
hello: '霖',
firstName: '杨',
lastName: '幂',
sum: 0,
},
methods: {
a() {
},
add() {
this.sum += 1
}
},
computed: {
fullName: {
// get函数何时调用?—— 有人使用fullName时
// get函数中的this是谁? —— vm
get() {
console.log('get')
return this.firstName.slice(0, 1).toUpperCase() + this.firstName.slice(1) + '-' + this.lastName
},
}
}
})
</script>
</html>
代码运行截图