详解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文件中调用js的实现方法小结
Oct 23 Javascript
基于KMP算法JavaScript的实现方法分析
May 03 Javascript
JavaScript获取和设置CheckBox状态的简单方法
Jul 05 Javascript
JavaScript:Div层拖动效果实例代码
Aug 06 Javascript
一个支付页面DEMO附截图
Jul 22 Javascript
JavaScript记录光标在编辑器中位置的实现方法
Apr 22 Javascript
简单模拟node.js中require的加载机制
Oct 27 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
Dec 08 Javascript
基于require.js的使用(实例讲解)
Sep 07 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
Vue中rem与postcss-pxtorem的应用详解
Nov 20 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
人族 TERRAN 概述
2020/03/14 星际争霸
php json与xml序列化/反序列化
2013/10/28 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
Django 视图层(view)的使用
2018/11/09 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
进口业务员岗位职责
2014/04/06 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
总结会主持词
2015/07/02 职场文书
护士岗位竞聘书
2015/09/15 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis