JS中有内置事件比如click,keyup。内置事件是给标签使用的,而自定义事件是给组件使用的。
在App中给School组件单项数据绑定getSchoolName,methods里面写getSchoolName(name),形参接收name,将方法传给School组件;
methods: {
getSchoolName(name) {
console.log('App收到了学校名', name)
}
}
再在School组件当中接收数据
methods: {
sendSchoolName() {
this.getSchoolName(this.name)
}
}
现在使用第二种方法将学生名传给App。
给Student组件的实例对象(vc)绑定了testa事件
methods方法
getStudentName(name) {
console.log('demo被调用了!', name)
}
Student中定义click事件
在Student的方法中定义click事件调用App的自定义事件testa(getStudentName方法传给了testa)
methods: {
sendStudentName() {
//触发Student组件实例身上的testa对象
this.$emit('testa', this.name)
}
}
在App中
this. r e f s . s t u d e n t 是 S t u d e n t 的实例对象,可以绑定事件, refs.student是Student的实例对象,可以绑定事件, refs.student是Student的实例对象,可以绑定事件,on当testa被触发执行回调getStudentName;这种写法的好处是灵活性很好。比如等3s给Student实例绑定对象
mounted() {
setTimeout(() => {
this.$refs.student.$on('testa', this.getStudentName)
}, 3000)
},
如果开发中参数很多,可以使用ES6中的一种方法来接受参数
ES6 引入 rest 参数(形式为 …变量名 ),用于获取函数的多余参数,这样就不 需要使用 arguments 对象了。rest 参数搭配的变量是一个数组,该变量将多余的 参数放入数组中。
getStudentName(name, ...params) {
console.log('demo被调用了!', name.params)
}
name接收一个参数,…params接收其余所有参数。
给谁绑定了自定义事件就给谁解绑。
在Student组件页面中给按钮设置解绑事件。
解绑一个自定义事件。
unbind() {
this.$off('testa')
}
解绑两个自定义事件
this.$off(['testa', 'demo'])
解绑所有的自定义事件
this.$off()
vm销毁的之后会移除所有的watchers 子组件和自定义事件,所以也可以直接销毁当前组件的实例,销毁后实例的所有的自定义事件失效
destroyed() {
this.$destroy()
}