详解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 相关文章推荐
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
Mar 23 Javascript
javascript时间自动刷新实现原理与步骤
Jan 06 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
Jan 27 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
jquery中map函数遍历数组用法实例
May 18 Javascript
JS动态增删表格行的方法
Mar 03 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
Nov 12 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
Dec 06 Javascript
JS立即执行的匿名函数用法分析
Nov 04 Javascript
JavaScript数组常用的增删改查与其他属性详解
Oct 13 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 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模拟http请求的方法详解
2016/11/09 PHP
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
Python代码注释规范代码实例解析
2020/08/14 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
Nike香港官网:Nike HK
2019/03/23 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
中学教师岗位职责
2013/11/26 职场文书
税务干部鉴定材料
2014/02/11 职场文书
技术经济专业求职信
2014/09/03 职场文书
大学四年个人总结
2015/03/03 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang
golang连接MySQl使用sqlx库
2022/04/14 Golang
React更新渲染原理深入分析
2022/12/24 Javascript