详解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
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
Javascript中的prototype与继承
Feb 06 Javascript
js实现数组去重方法及效率?Ρ? target=
Feb 14 Javascript
javascript内存分配原理实例分析
Apr 10 Javascript
Angular+Node生成随机数的方法
Jun 16 Javascript
vue左侧菜单,树形图递归实现代码
Aug 24 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
May 16 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
Nov 11 Javascript
js HTML DOM EventListener功能与用法实例分析
Apr 27 Javascript
JS前端基于canvas给图片添加水印
Nov 11 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+jQuery实现自动补全功能源码
2013/05/15 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python本地与全局命名空间用法实例
2015/06/16 Python
Python中防止sql注入的方法详解
2017/02/25 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python之文字转图片方法
2018/05/10 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
Python猜数字算法题详解
2020/03/01 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
英国钻石公司:British Diamond Company
2020/02/16 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
建筑项目策划书
2014/01/13 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
汽车修理厂管理制度
2015/08/05 职场文书