三、封装全局公共 BUS 数据改变,触发监听方法
1、utils 目录下 bus.js 文件代码示例:
import Vue from ‘vue‘ const Bus = new Vue() export default Bus
2、通信传递引用 bus 示例:
import bus from ‘@/utils/bus‘; // 引入
methods: {
  changValue() {
    bus.$emit(‘changeValue‘, ‘zs‘);      
  }  
}
3、 通信接收方法触发 示例:
  import bus from ‘@/utils/bus‘;
  mounted() {
    bus.$on(‘changeValue‘, (e) => {
        console.log(e); // zs
      }
    });
  },
PS: BUS 更适用于组件之间关联不大,或者层级嵌套比较深的组件之前传值
四、provide\inject 上级向下级单项传参
这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效。
理解:只要上级组件提供provide属性,下级组件无论层级多深都可以通过inject 注入依赖
ps: 这种方式传递参数是不可响应的,当provide 中值的改变不会影响到inject的接收
父组件示例:
<template>
  <div id="app">
    <child></child>
    <button type="button" @click="changeProvide">change</button>
  </div>
</template>
<script>
import Child from "@/components/Child";
export default {
  name: "App",
  provide: {
    name: ‘zs‘
  },
  components: {
    Child,
  },
  methods: {
    changeProvide() {
      this.$set(this._provided, ‘name‘, ‘ls‘)
      console.log(this._provided) // ls
    }
  }
};
子组件示例:
<template>
  <div class="child-deep">
    <child-deep></child-deep>
  </div>
</template>
<script>
import ChildDeep from ‘@/components/ChildDeep‘
export default {
  name: "Child",
  components: {
    ChildDeep
  }
}
</script>
最下级组件示例:
<template>
  <div class="child-deep">
    <button type="button" @click="getProvide">button</button>
  </div>
</template>
<script>
export default {
  inject: [‘name‘],
  methods: {
    getProvide() {
      console.log(this.name); // zs zs
    }
  }
}
</script>
五、其他通信方式
1、引用 vuex 这个状态管理工具;
2、子组件通过this.$parents获取上层组件变量与方法;
3、父组件通过 ref 属性 this.$refs[ref] 获取子组件变量与方法。
原文:https://www.cnblogs.com/eightabs/p/14051564.html