自定义事件可以用于父子组件之间传递数据,与 props 相比,自定义事件传递数据的优势是可以进行事件的解绑,也就是可以做到动态地传递数据,开发起来更加灵活。
基本语法:
绑定事件:在父组件进行
法1:
<Student @baciii="demo"/>
<Student v-on:baciii="demo"/>
法2:
this.$refs.student.$on('baciii',this.demo);
执行自定义事件:
<button @click="sendstudentname">
sendstudentname(){
this.$emit('baciii',this.name);
}
解绑事件:在子组件进行
法1:
this.$off('baciii');//解绑一个事件
法2:
this.$off(['baciii','demo1']);//解绑多个事件用数组
法3:
this.$off();//解绑所有自定义事件
简要解释:
- 首先在父组件中给子组件绑定自定义事件,可以在子组件标签上绑定,@+事件名 / v-on+时间名=“该事件的回调函数”。也可以通过 ref 配置项让父组件得到子组件的真实 DOM 元素,再通过 $on 绑定自定义事件和回调函数,这种方法较为灵活,可以在某些指定时间点再进行绑定。而通过 v-on 的方法在页面加载时即进行绑定。
- 在子组件中通过某种事件利用 $emit() 触发自定义事件并传递参数,触发时即调用父组件对应的回调函数,子组件中传递的参数会作为回调函数的参数使用,这样就做到了给父组件传递子组件的数据。
- 解绑事件则分为三种方式通过 $off() 分别对应单事件、多事件、全部事件解绑。
注意事项:
当当前组件/ Vue 实例生命周期结束时,所有自定义事件随即解绑,但是 js 原生的事件仍保持正常作用,如 click、keydown等
若想要给子组件绑定原生 js 事件,如 click 等,需要加上 native 修饰符。否则统一当作自定义事件
<student @click.native="demo"/>
事件绑定的三种写法:第二种方法不能正常执行(此处 this.demo 为父组件上的 methods,this.name 为父组件上的 data)
this.$refs.student.$on('baciii',this.demo);
this.$refs.student.$on('baciii', function(name) {
this.name = name;
})
this.$refs.student.$on('baciii', name => {
this.name = name;
})
第二种方法直接把一个简单函数作为回调函数写在 $on 绑定自定义事件时,那么此处函数中的 this 默认为触发该事件的主体,则子组件的实例化对象,数据也就不能正常传递到父组件上。
而方法三中使用箭头函数则不会出现该问题,函数会寻找到父组件的实例化对象作为执行时的this。
方法一则是调用了父组件上的 methods ,methods 上的函数只要不写成箭头函数,那么函数的 this 指向永远为当前组件的实例化对象。箭头函数的 this 指向为 window。