10-内置事件和组件自定义事件
2022-07-18 本文已影响0人
荆承鹏
1. 介绍
@click, keyup, keydown, update 等这些都是 js 内置的事件,可以直接用。
自定义事件是给组件用的。
2. 子向父组件传值的方法
<!-- 通过父组件给子组件传递函数类型的 props实现:子给父传递数据 -->
<School :getSchoolName="getSchoolName"/>
<!-- 通过父组件给子组件绑定一个自定义组件事件实现:子给父传递数据 (第一种写法:通过@或者v-on绑定事件)-->
<!-- 自定义了一个事件atguigu,这个事件被绑定在了组件 Student 的实例对象 vc上,所以当这个组件被触发的时候,调用函数sendStudentName -->
<!-- <Student v-on:atguigu="getStudentName"/> -->
<!-- 通过父组件给子组件绑定一个自定义组件事件实现:子给父传递数据 (第二种写法:通过ref绑定事件)-->
<!-- 通过this.$refs.student 可以拿到Student实例对象vc -->
<Student ref="student"/>
3. 代码
父级组件 app
<template>
<div>
<div id="mainContent">
<h1>自定义组件事件</h1>
<!-- 通过父组件给子组件传递函数类型的 props实现:子给父传递数据 -->
<School :getSchoolName="getSchoolName"/>
<!-- 通过父组件给子组件绑定一个自定义组件事件实现:子给父传递数据 (第一种写法:通过@或者v-on绑定事件)-->
<!-- 自定义了一个事件atguigu,这个事件被绑定在了组件 Student 的实例对象 vc上,所以当这个组件被触发的时候,调用函数sendStudentName -->
<!-- <Student v-on:atguigu="getStudentName"/> -->
<!-- 通过父组件给子组件绑定一个自定义组件事件实现:子给父传递数据 (第二种写法:通过ref绑定事件)-->
<!-- 通过this.$refs.student 可以拿到Student实例对象vc -->
<Student ref="student"/>
</div>
</div>
</template>
<script>
//import 引入所有组件
import Student from './components/Student.vue'
import School from './components/School.vue'
export default {
name: "App", // 给app组建命名为 App
//注册注册组件 components: { School,Student },
components: {School,Student},
data(){
return {
}
},
methods:{
getSchoolName(name){
console.log("我收到了学校的名字", name)
},
getStudentName(name){
console.log("自定义组件事件被调用了,我收到了数据", name)
}
},
mounted(){
//在mounted挂载完毕以后,执行下面的操作
//this.$refs.student 拿到了Student组件的实例对象vc,$on 是给vc绑定事件。时间名为 atguigu, 事件回调函数为 this.getStudentName
this.$refs.student.$on("atguigu", this.getStudentName)
}
}
</script>
<style>
</style>
子组件 School.vue
<template>
<div id="school">
学校名:{{msg2}}
<br><br>
学校地址:{{address}}
<br><br>
<button @click="sendSchoolName">点击我把学校名称传到 app</button>
</div>
</template>
<script>
export default {
name:"School",
props:["getSchoolName"],
data(){
return {
msg2: "jing c p",
address:"长安区"
}
},
methods:{
sendSchoolName(){
this.getSchoolName(this.msg2)
}
}
}
</script>
<style scoped>
#school{
background-color: grey;
height: 200px;
}
</style>
子组件 Student.vue
<template>
<div id="student">
学生名:{{msg}}
<br><br>
学生年龄:{{age}}
<br><br>
<button @click="sendStudentName">点击把学生名字传到 app</button>
</div>
</template>
<script>
export default {
name: "Student",
data(){
return {
msg: "Jackie",
age:18
}
},
methods:{
sendStudentName(){
this.$emit("atguigu", this.msg)
}
}
}
</script>
<style scoped>
#student{
background-color: green;
height: 200px;
}
</style>
4.解绑自定义组件事件
在哪个组件上绑定的事件,就在哪个组件上解绑。解绑的方式有四种
methods:{
unbind(){
this.$off("事件名") //解绑一个事件
this.$off() // 解绑所有事件
this.$off(["事件名1","事件名2"]) //解绑两个事件或更多
//还有一种方法是把整个组件的实例对象销毁,组件(vc)销毁以后在组件上的自定义事件也被销毁了
}
}
5. 总结
-
自定义组件事件是一种组件间通信的方式,适用于:子给父组件传递信息。
-
使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)
-
绑定自定义事件
第一种方式:
在父组件中:<Dome @aiguigu="test"/>
或者<Dome v-on:atguigu="test"/>
第二种方式:
在父组件中:
<Demo ref="demo"/>
....
mounted(){ this.$refs.xxx.$on("atguigu", this.test) }
备注:如果想让自定义事件只触发一次,可以使用 once
修饰符或者$once
方法
-
触发自定义事件:
this.$emit("atguigu",数据)
-
解绑自定义事件:
this.$off('atguigu')
-
组件上也可以绑定原生dom事件,如果
click
事件,但是为了让其生效需要使用修饰符native
, 比如<Demo @click.native="test"/>
-
注意:通过
this.$refs.xxx.$on('atguigu', 回调函数)
绑定自定义事件的,回调要么配置在methods
里,要么使用箭头函数,否则this
指向会有问题。