vue-组件之间的通信方式

164 阅读2分钟

前言:组件之间的通信方式,包括子组件===>父组件的通信,父组件===>子组件的通信,以及任意组件之间的通信三种情况,具体方法看下面介绍:

1.组件的自定义事件

适用于子组件===>父组件的通信

  1. 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。

  2. 绑定自定义事件:

    1. 第一种方式,在父组件中:<Demo @mytest="test"/><Demo v-on:mytest="test"/>

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

      <Demo ref="demo"/>
      ......
      mounted(){
         this.$refs.xxx.$on('mytest',this.test)
      }
      
    3. 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。

  3. 触发自定义事件:this.$emit('mytest',数据)

  4. 解绑自定义事件this.$off('mytest')

  5. 组件上也可以绑定原生DOM事件,需要使用native修饰符。

  6. 注意:通过this.$refs.xxx.$on('mytest',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

2.全局事件总线(GlobalEventBus)

适用于任意组件间通信

  1. 安装全局事件总线:

    new Vue({
    	......
    	beforeCreate() {
    		Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
    	},
        ......
    }) 
    
  2. 使用事件总线:

    1. 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。

      methods(){
        demo(data){......}
      }
      ......
      mounted() {
        this.$bus.$on('xxxx',this.demo)
      }
      
    2. 提供数据:this.$bus.$emit('xxxx',数据)

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

3.消息订阅与发布

适用于任意组件间通信
使用步骤:

  1. 安装pubsub:npm i pubsub-js

  2. 引入: import pubsub from 'pubsub-js'

  3. 接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。

    methods(){
      demo(data){......}
    }
    ......
    mounted() {
      this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息
    }
    
  4. 提供数据:pubsub.publish('xxx',数据)

  5. 最好在beforeDestroy钩子中,用PubSub.unsubscribe(pid)取消订阅。

4.插槽slot

适用于 父组件 ===> 子组件
作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式
分为默认插槽、具名插槽、作用域插槽

5.vuex

适用于任意组件间通信
在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式
使用:当多个组件需要共享数据时