详解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 相关文章推荐
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
Mar 12 Javascript
关于session和cookie的简单理解
Jun 08 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
jQuery实现两列等高并自适应高度
Dec 22 Javascript
javascript常用经典算法详解
Jan 11 Javascript
前端开发之CSS原理详解
Mar 11 Javascript
JavaScript中splice与slice的区别
May 09 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
从源码角度来回答keep-alive组件的缓存原理
Jan 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
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
php购物车实现代码
2011/10/10 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
JavaScript中的标签语句用法分析
2015/02/10 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
python的Template使用指南
2014/09/11 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Collection和Collections的区别
2016/05/02 面试题
.net面试题
2016/09/17 面试题
自主招生推荐信范文
2014/05/10 职场文书
部门活动策划方案
2014/08/16 职场文书
颐和园的导游词
2015/01/30 职场文书
2015年老干部工作总结
2015/04/23 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书