Vue 自定义事件和全局事件总线

组件的自定义事件 

使用场景

  A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)

绑定自定义事件

在父组件中:
<HelloWorld @customEvent="test1"/>

  或

<HelloWorld v-on:customEvent="test1"/>

  (2)第二种方式,在父组件中:

<Demo ref="demo"/>
......
mounted(){
   this.$refs.xxx.$on('customEvent',this.test1)
}

  (3)若想让自定义事件只能触发一次,可以使用 once 修饰符,或 $once 方法。

<HelloWorld @customEvent.once="test1"/>

触发自定义事件

   其中数据为事件回调函数的参数,按顺序添加参数即可
this.$emit('customEvent',数据)

解绑自定义事件

this.$off('customEvent')

注意

  通过 this.$refs.xxx.$on('customEvent', 回调) 绑定自定义事件时,回调函数的this指向问题,最好使用箭头函数或配置在methods中

全局事件总线

安装全局事件总线

  既然自定义组件可以通过子组件来改变父组件的属性,实现通信,那么是否可以在关系更远的组件间通信呢?

  答案是可以的,其实也可以想到,直接在最上层组件定义自定义事件不就可以了吗。

  Vue专门为此提供了一种组件间通信的方式,适用于任意组件间通信。

  安装全局事件总线:

  在main.js中,通常在beforeCreate函数中安装全局事件总线

  最晚在beforeMount中安装,不然会报错,从此也可以看出事件注册是在beforeMount之后开始的

// main.js
new Vue({
   ......
   beforeCreate() {
      Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
   },
      ......
}) .$mount('#app')

使用事件总线

  全局事件总线的使用和自定义事件很像,如下:

  注册事件:

methods(){
   demo(data){......}
}
......
mounted() {
   this.$bus.$on('xxxx',this.demo)
}

  触发事件:

this.$bus.$emit('xxxx',数据)

   最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件

posted @ 2022-12-23 11:01  邢韬  阅读(174)  评论(0编辑  收藏  举报