前面的话

在实际业务中,除了父子通信外,还有很多非父子组件通信的场景,非父子组件一般有两种,兄弟组件和跨多级组件。Vue.js 2.x中,使用一个空的Vue实例作为中央事件总线(bus)。
中央事件总线就好比一个中介,租房者与出租者担任两个跨级组件,租房者与出租者之间的联系全靠中介,而两个跨级组件之间的通信全靠中央事件总线(bus)。

中央事件总线

<div id="app1"><component-a></component-a><component-b></component-b>
</div>
<script>var bus = new Vue();var app1 = new Vue({el: '#app1',components: {'component-a': {template:  `<p>{{message}}{{changeMsg}}</p>`,data() {return {message: ''}},computed:{changeMsg() {var that = this;// 监听来自bus实例的事件bus.$on('on-message',function(msg) {that.message = msg;})}} },'component-b': {template: `<button @click="handleEvent">传递事件</button>`,methods: {handleEvent: function() {// 点击按钮通过bus把事件on-message发出去bus.$emit('on-message','来自组件component-b的内容')}}}}});
</script>

上例中组件component-a与component-b是兄弟关系: 首先创建了一个名为bus的空实例,作为中央事件总线。然后创建了 Vue实例app1, 局部定义了两个兄弟组件,在component-b组件中,点击按钮会通过bus把事件on-message发出去;在 component-a中用监听属性监听来自bus实例的事件。


除了中央事件bus外,还有两种方法可以实现组件间通信:父链与子组件索引.

父链

在子组件中,使用this.$ parent可以直接访问该组件的父实例或组件,父组件也可以通过this.$children访问它的所有 的子组件,而且可以递归向上或向下无线访问,直到根实例或最内层的组件。

  <div id="app2"><parent-component></parent-component></div><script>var childNode = {template: `<button @click="handleEvent">通过父链直接修改数据</button>`,methods: {handleEvent() {// 访问父链后,可以做任何操作,比如直接修改数据this.$parent.message = '来自组件child-component的内容'}}}var app2 = new Vue({el:'#app2',components: {'parent-component': {template:   `<div class="parent"><p>{{message}}</p><child-component></child-component></div>`,data() {return {message: ''}},components:  {'child-component': childNode}}}});
</script>



尽管Vue允许这样操作,但是在业务中,子组件应该尽可能避免依赖父组件的数据,更不该去修改它的数据,这样 使得父子组件紧耦合,父组件可以被任意组件修改,理想情况下,只有组件自己能修改它的状态。父子组件最好 还是通过props和$emit来通信。

子组件索引

当子组件较多时,通过this.children来一一遍历出我们需要的一个组件实例是比较困难的,尤其是组件动态渲染时,它们的序列是不固定的。Vue提供子组件索引的方法,用特殊的属性ref来为子组件指定一个索引名称。

    <div id="app3"><parent-component></parent-component></div><script>var app3 = new Vue({el:'#app3',components: {'parent-component': {template: `<div class="parent"><button @click="handleRef">通过ref获取子组件实例</button><child-component ref="childCom"></child-component></div>`,components: {'child-component':  {template: `<div>子组件</div>`,data(){return {message: '子组件的内容'}}}},methods: {handleRef() {// 父组件通过$ref来访问指定的实例var msg = this.$refs.childCom.message;console.log(msg);}}}}})
</script>

在父组件模板中,子组件标签上使用ref指定一个名称,并在父组件内通过this.$refs来访问指定名称的子组件。

注意:$refs只在组件渲染完成后才填充,并且时非响应式的。它仅仅作为一个直接访问子组件的应急方案,应当避免在模板或计算属性中使用 $ refs

Vue 非父子组件通信相关推荐

  1. Vue 非父子组件通信方案

    Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...

  2. Vue 非父子组件通信 (ref)

    Vue 非父子组件通信 (ref) 流程:1. 先在son子组件中定义一个数据和事件处理程序data( ) { return { flag: false }} , methods: { cry( ) ...

  3. VUE非父子组件通信Bus——公交车踩坑笔记

    抛开父子组件的通讯,对于非父子组件通信,简单的数据交互,使用Bus是非常不错的. 遇到的坑有两个. 1.两个组件的信息交互代码写在哪个生命周期函数中,如果只是点击组件A标签触发函数,然后向界面B传递参 ...

  4. VUE非父子组件通信

    非父子组件通信 vue非父子组件传值方式,本文章整理了两种方式:vuex和总线bus.vuex相比于总线bus来说非常的稳定,推荐直接使用vuex. 我看其他的文章基本上是[点击导航栏回退的时候,去获 ...

  5. Vue非父子组件通信的几种方式

    文章目录 1.provide和inject 1.1基本使用 1.2如何处理响应式数据 2.全局事件总线mitt库 2.1安装mitt库,封装eventbus.js工具类 2.2在其中一个组件中触发事件 ...

  6. Vue之非父子组件通信

    Vue之非父子组件通信 非父子组件传值方法: 1:在model中新建一个js文件 引入Vue 实例化Vue  最后暴露相关实例 // 引入vue import Vue from 'vue' // 创建 ...

  7. vue父子组件通信以及非父子组件通信的方法

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...

  8. 子组件调用父组件方法_vue父子组件通信以及非父子组件通信的方法

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...

  9. Vue的父子组件通信(十种)

    设计的面试题 Vue中父子组件通信有哪些方式? 概述 通信方式无外乎就那几种: Prop 常用$emit 组件封装用的较多.sync 语法糖 (较少)$attrs和$listeners(组件封装用的较 ...

最新文章

  1. iOS 微信SDK1.8.6后需要UniversalLink解决方案及采坑记录
  2. 中学再不学编程就晚了?MIT、JHU研究:程序员大脑思考代码的机制不对劲
  3. 一句话实现php日期转中文汉字
  4. C-C Primer Plus阅读笔记
  5. Atom React或前端插件推荐
  6. python高级编程知识点_(转)python 高级编程技巧学习笔记
  7. HDU 6703 array(主席树 + set)
  8. 自然数 素数 质数_在Java中获取素数的无限列表
  9. java写出http数据包_java用jpcap怎么识别出http和https的数据包?
  10. 冷凝器换热效果变差后果
  11. Windows Server 2008 R2更新永恒之蓝 补丁包方法
  12. VeriSign SSL证书产品及服务_VeriSign证书|SSL证书|EVSSL证书|服务器证书|数字证书
  13. 基于MATLAB的QAM调制与解调系统设计
  14. 如何运用SWOT分析法
  15. Mac电脑怎么使用ping命令
  16. IPV4与IPV6练习
  17. 图森面试官| 图森未来首席科学家王乃岩:播下去的种子,早晚会开花
  18. 罗技G304接收器无反应问题,现象及解决方法
  19. Pycharm 许可证过期解决
  20. 谷歌google自动打开开发调式工具问题DevTools

热门文章

  1. centos7安装mysql(mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar)
  2. Python练级打怪全攻略——从上手到走出新手村
  3. 智能门铃中可视对讲的回音消除
  4. 每天学点英语语法-重头开始8
  5. html中的xmlns是什么意思?
  6. 一个简单的加密解密程序
  7. vulnhub渗透系列之DC(一) :内含suid的三种提权方法
  8. Trans系列中的hits@10、Mean rank
  9. 【周志华机器学习】六、支持向量机
  10. “腾讯TLive-无缝接流”护航各大卫视跨年晚会完美收官