组件自定义事件的基本使用和注意事项

285 阅读1分钟

组件的自定义事件

1.1使用场景:

子组件(传数据) ===> 父组件(接数据)

2.1 基本使用

在父组件中绑定 parent.vue

//方式一 通过v-on绑定,hhh是自定义事件名,test接收回调
<Demo @hhh="test"/> 
<Demo v-on:hhh="test"/>
//方式二 通过ref绑定,hhh是自定义事件名,test接收回调
<Demo ref="xxx"/> 
mounted(){
   this.$refs.xxx.$on('hhh',this.test)
}
--------------------------------------------
methods:{
    test (val) {}   //通过val接收数据
}

在子组件中触发 children.vue

mounted(){
   this.$emit('hhh',data) //data是传递过去的数据
}

3.1 其他语法

3.1.1 解绑事件

children.vue

mounted(){
   this.$off('hhh') 
}

3.1.2 原生事件

parent.vue

//只触发一次 once
<Demo @hhh.once="test"/>    
//绑定原生事件 native  (Vue在绑定自定义事件中,默认事件名都是自定义,若想使用原生的需要加native)
<Demo @hhh.native="click"/>

4.1 注意事项

通过this.refs.xxx.refs.xxx.on('hhh',callback)绑定自定义事件时,callback一般情况下放在methods,通过this去调用,假如你想直接写回调函数,需要注意this指向问题(this默认指向传递过来组件实例对象,而我们需要当前组件的实例对象)

错误做法

parent.vue

this.$refs.name.$on('hhh',function (val) {
        console.log(this)  //这里this指向传递过来的组价实例对象,而不是我们想要的父组件的this
})

正确做法

//方式一(推荐)写到methods中,通过this去调用
this.$refs.name.$on('hhh',this.test)
methods:{
    test (val) {}   //通过val接收数据
}
//方式二 (少用,一般会忘了this指向问题,导致一时半会解决找不到问题所在)使用箭头函数
 this.$refs.name.$on('hhh',(val)=> {
        console.log(this)   //箭头函数没有this,此时指向父组件实例对象
})

如果觉得有帮助欢迎点赞、评论。 上述内容仅仅代表个人观点,如有错误,请指正。如果你也对前端感兴趣,欢迎访问我的个人博客sundestiny.github.io/myblog/