详解Vue 非父子组件通信方法(非Vuex)


Posted in Javascript onMay 24, 2017

一提到两个非父子组件通信方法,有经验的 coder 肯定会说用 Vuex 啊,我个人建议不要为了用 Vuex 而用 Vuex,除非你的项目很大,耦合度很高,需要大量的储存一些 data,组件之间通信频繁。当然还是要根据自己的业务场景的来决定,总之还是那句话,不要为了用 Vuex 而用 Vuex!

Vue 官网介绍了非父子组件通信方法:

详解Vue 非父子组件通信方法(非Vuex)

不过官网说的太简单了,新手看完估计还是一脸懵逼。还有这个空的 Vue 实例放到哪里合适也值得商榷。

这篇文章的目的就是用一个简单的例子让你明白如何用 Bus ? 来进行通信:

详解Vue 非父子组件通信方法(非Vuex)

假设 bb 组件里面有个按钮,点击按钮,把 123 传递给 aa 组件

// 根组件(this.$root)
new Vue({
 el: '#app',
 router,
 render: h => h(App),
 data: {
  // 空的实例放到根组件下,所有的子组件都能调用
  Bus: new Vue()
 }
})

bb 组件内调用事件触发↓

<button @click="submit">提交<button>

methods: {
  submit() {
   // 事件名字自定义,用不同的名字区别事件
   this.$root.Bus.$emit('eventName', 123)
  }
 }

aa 组件内调用事件接收↓

// 当前实例创建完成就监听这个事件
 created(){
  this.$root.Bus.$on('eventName', value => {
   this.print(value)
  })
 },

 methods: {
  print(value) {
   console.log(value)
  }
 },

 // 在组件销毁时别忘了解除事件绑定
 beforeDestroy() {
   this.$root.Bus.$off('eventName')
 },

这样就可以了,是不是很简单?

问题一:如果有多个组件组件需要通信,是不是要在根组件上多建几个 Bus?
答:不需要的,只要保证事件名 (eventName)不一样就行了。

问题二:为什么要弄个 Bus?直接 this.$root.$on、this.$root.$emit 不更简单粗暴?

答:按照文档上的说法是专门用一个空的 Vue 实例(Bus)来做中央事件总线更加清晰也易于管理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Js 本页面传值实现代码
May 17 Javascript
学习ExtJS form布局
Oct 08 Javascript
jquery如何获取复选框的值
Dec 12 Javascript
JavaScript多图片上传案例
Sep 28 Javascript
jquery网页加载进度条的实现
Jun 01 jQuery
jQuery 实现双击编辑表格功能
Jun 19 jQuery
原生JS实现小小的音乐播放器
Oct 16 Javascript
js传递数组参数到后台controller的方法
Mar 29 Javascript
js实现下拉框二级联动
Dec 04 Javascript
layer iframe 设置关闭按钮的方法
Sep 12 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 Javascript
基于vuex实现购物车功能
Jan 10 Vue.js
微信小程序 支付功能(前端)的实现
May 24 #Javascript
微信小程序 选项卡的简单实例
May 24 #Javascript
JS回调函数基本定义与用法实例分析
May 24 #Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
May 24 #jQuery
详解前后端分离之VueJS前端
May 24 #Javascript
JQuery Ajax 异步操作之动态添加节点功能
May 24 #jQuery
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
May 24 #Javascript
You might like
php discuz 主题表和回帖表的设计
2009/03/13 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
jquery 回车事件实现代码
2011/08/23 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Python中的random()方法的使用介绍
2015/05/15 Python
python提取字典key列表的方法
2015/07/11 Python
python select.select模块通信全过程解析
2017/09/20 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
Python socket 套接字实现通信详解
2019/08/27 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
大三自我鉴定范文
2013/10/05 职场文书
网站美工岗位职责
2014/04/02 职场文书
一体化教学实施方案
2014/05/10 职场文书
环保倡议书格式范文
2014/05/14 职场文书
化工专业自荐书
2014/06/16 职场文书
好的旅游活动方案
2014/08/19 职场文书
让子弹飞观后感
2015/06/11 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
使用javascript解析二维码的三种方式
2021/11/11 Javascript
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏