日常小常识:Vue兄弟间怎么通信

169 阅读1分钟

Vue.js 的核心: 一个允许采用简洁的模板语法声明式地数据渲染进 DOM的系统:

父子间通信:

大家都知道父子间通信,通过props【父子】和自定义的事件【子父】。

??那么兄弟间组件应该怎么通信呢???

  1. 父组件通过props向子组件发送数据:
   父组件:
       <child :loading="loading"/>
   子组件:
       props:{
           loading:{
               type:Boolean,
               default:false
           }
       }
  1. 子组件通过this.$emit()向父组件发送数据 | 父组件接收@A=A1
   子组件: this.$emit('自定义方法A')
   父组件:
       <child @A=A1/>
       methods:{
          A1(){
              console.log("子组件点击后,父组件的这里会触发")
          }
       }

兄弟间通信核心思想:

定义一个全新的vue实例,赋值给一个大家都访问到的对象,各个组件都能访问的对象方式可以有以下几种:

  1. 单独的eventBus文件,export import 【推荐】
  2. 在main.js中全局的实例的data中定义一个新的vue实例。$root 访问
  3. Vue.prototype.$vm = new Vue() 定义全局变量

因为 新定义的eventBus对象是一个Vue实例,vue实例有$emit方法

第一种:eventBus【推荐】

新建一个js文件 eventBus.js

import Vue from 'vue'
export const eventBus = new Vue()

组件A:

import {eventBus} from ./js/eventBus.js
eventBus.$emit('触发名称send', 数据)

组件B:

import {eventBus} from ./js/eventBus.js
eventBus.$on('触发名称send',(数据)=>{
    console.log("A组件点击后,这里会触发")
})

第二种:$root

我们都知道vue的状态管理使用的是vuex,如果项目不大,逻辑不多,我们只需要使用$root 设置vue实例的data就可以了。

$root:根父组件

$parent: 最近一级的父组件

main.js

  new Vue({
      el:"#app",
      router,
      data(){
         return {
             vm:new Vue()
         }
      }
  })

组件A

this.$root.vm.$emit('send',data)

组件B

this.$root.vm.$on('send',data)

第三种:在main.js中定义全局变量

Vue.prototype.$vm = new Vue();
//使用
this.$vm.$emit('send',data);
this.$vm.$on('send',data);