Vue2 - 23-03-27

First Post:

Last Update:

Vue2 - 23-03-27

组件的自定义事件

在父组件中定义自定义事件以及方法(父组件),然后子组件在需要的地方进行触发该事件,可以在第二个以后参数传入子组件的相关东西

触发事件之后调用的方法是父组件的方法,父组件给子组件绑定上的自定义事件,然后由子组件触发该事件,进而调用了父组件的方法

App.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<template>
<div>
<h1 class="apph">{{msg}}</h1>
<!-- 通过标签v-on的形式 -->
<Student v-on:getStudentNameEvent="getStudentName"/>
<hr>
<!-- 使用ref+生命周期钩子进行绑定 -->
<Student ref="student"/>
<hr>
<!-- 通过v-bind单向绑定进行传入,子组件props进行接收 -->
<School :getSchoolName='getSchoolName'/>
</div>
</template>

<script>
import Student from "./components/Student.vue"
import School from "./components/School.vue"
export default {
name:'App',
components:{
Student,
School
},
data(){
return {
msg:'你好啊!'
}
},
methods:{
getSchoolName(name) {
console.log('App得到了学校名称:'+name);
},
getStudentName(name){
console.log('App得到了学生姓名:'+name);
}
},
mounted(){
this.$refs.student.$on('getStudentNameEvent', this.getStudentName)
}
}
</script>
<style scoped>
.apph{
background-color: pink;
}
</style>

Student.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<template>
<div class="demo">
<h2>学生姓名:{{name}}</h2>
<h2>学生年龄:{{age}}</h2>
<button @click='sendStudentName'>点我发送学生名给父组件</button>
</div>
</template>

<script>
export default {
name:'Student',
data() {
return {
name:'linzepore',
age:21
}
},
methods:{
sendStudentName(){
//触发tudent实例的zepoevent事件
this.$emit('getStudentNameEvent',this.name)
}
}
}
</script>

<style scoped>
.demo {
background-color: gray;
}
</style>

自定义组件的两种绑定方式:

  • v-on/@ + 自定义事件名称
  • 标签上加ref属性,在mounted钩子上调用获取的子组件,然后进行绑定,this.$refs + .ref属性值 + .$on / $once

ref属性忘了?

参考这篇文章:HERE

  • ref 属性被用来给元素或子组件注册引用信息(id的替代者),相当于对页面元素或子组件标识,使用 ref 属性标识页面元素或子组件之后,被标识的元素或子组件会被所在的组件实例对象收集,挂载在所在组件实例对象的$ref属性上
  • ref 属性应用在 html 标签元素上,获取的是对应的真实DOM元素;ref 属性应用在组件标签上,获取的是对应组件实例对象

还可以加上修饰符

this.$refs.student.$once('eventName',params) /
@eventName.once='methodsName'

注意事项

在父组件给子组件标签实例绑定的事件都会被视为自定义事件,如果定义为原生的,可以这样写@click.native

自定义事件在子组件的触发以及在父组件的接收

假如父组件给子组件绑定
v-on:eventA="getParams"

子组件可以通过这种方式触发事件
this.$emit('eventA',param1,param2,param3,...)

那么父组件可以通过定义这种方式进行接收:
getParams(a, ...params) {}

解绑自定义事件

1
2
3
this.$off('eventName')//解绑一个
this.$off(['eventName1','eventName2'])//解绑多个
this.off()//解绑所有

通过ref传递的时候,回调函数注意事项

通过ref绑定自定义事件的时候,回调函数要写成箭头函数,要么就得写在methods里,不应该写成普通函数(this的指向变成vc实例)