详解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 相关文章推荐
Javascript 解疑
Nov 11 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
Oct 11 Javascript
js写一个字符串转成驼峰的实例
Jun 21 Javascript
判断浏览器的内核及版本号方法汇总
Jan 05 Javascript
jQuery特殊符号转义的实现
Nov 30 Javascript
bootstrap table 数据表格行内修改的实现代码
Feb 13 Javascript
Vue中img的src属性绑定与static文件夹实例
May 18 Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 Javascript
详解React中setState回调函数
Jun 14 Javascript
vue cli安装使用less的教程详解
Jul 12 Javascript
vue基本使用--refs获取组件或元素的实例
Nov 07 Javascript
解决Antd Table组件表头不对齐的问题
Oct 27 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桌面中心(一) 创建数据库
2007/03/11 PHP
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
python3 mmh3安装及使用方法
2019/10/09 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
个人向公司借款协议书
2014/10/09 职场文书
高校教师个人总结
2015/02/10 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
Python机器学习之KNN近邻算法
2021/05/14 Python
Node与Python 双向通信的实现代码
2021/07/16 Javascript
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server