详解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 相关文章推荐
使用jquery的ajax需要注意的地方dataType的设置
Aug 12 Javascript
详细解密jsonp跨域请求
Apr 15 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
Aug 26 Javascript
JS实现HTML标签转义及反转义
Apr 14 Javascript
Popup弹出框添加数据实现方法
Oct 27 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
java实现单链表增删改查的实例代码详解
Aug 30 Javascript
vue实现select下拉显示隐藏功能
Sep 30 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
gojs实现蚂蚁线动画效果
Feb 18 Javascript
微信小程序 支付功能(前端)的实现
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
ZendFramework2连接数据库操作实例
2017/04/18 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
javascript 原型继承介绍
2011/08/30 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
Python如何获取文件路径/目录
2020/09/22 Python
使用Python解析Chrome浏览器书签的示例
2020/11/13 Python
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
医药个人求职信范文
2014/01/29 职场文书
合伙协议书
2014/04/23 职场文书
授权委托书公证
2014/09/14 职场文书
监守自盗观后感
2015/06/10 职场文书
MySQL基础(一)
2021/04/05 MySQL
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js