详解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控制div及网页相关属性的代码
Dec 19 Javascript
javascript中用星号表示预录入内容的实现代码
Jan 08 Javascript
javascript列表框操作函数集合汇总
Nov 28 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
Sep 26 Javascript
React Native 搭建开发环境的方法步骤
Oct 30 Javascript
解决vue 绑定对象内点击事件失效问题
Sep 05 Javascript
小程序实现列表点赞功能
Nov 02 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 Javascript
详解vue组件中使用路由方法
Feb 12 Javascript
layui递归实现动态左侧菜单
Jul 26 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
Aug 09 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 07 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
php在线代理转向代码
2012/05/05 PHP
php全排列递归算法代码
2012/10/09 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
js 日期转换成中文格式的函数
2009/07/07 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
微信小程序实现搜索历史功能
2020/03/26 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
wxPython使用系统剪切板的方法
2015/06/16 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
中国世界遗产导游词
2015/02/13 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android