详解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 相关文章推荐
使用TextRange获取输入框中光标的位置的代码
Mar 08 Javascript
jQuery 滑动方法slideDown向下滑动元素
Jan 16 Javascript
jQuery中hasClass()方法用法实例
Jan 06 Javascript
js中的关联数组与普通数组详解
Jul 27 Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
vue-cli中安装方法(图文详细步骤)
Dec 12 Javascript
通过实例讲解JS如何防抖动
Jun 15 Javascript
vue 实现单选框设置默认选中值
Nov 07 Javascript
vue跳转方式(打开新页面)及传参操作示例
Jan 26 Javascript
详解js创建对象的几种方式和对象方法
Mar 01 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
如何将数据从文本导入到mysql
2006/10/09 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
在python中画正态分布图像的实例
2019/07/08 Python
使用python实现名片管理系统
2020/06/18 Python
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
大学毕业通用个人的求职信
2013/12/08 职场文书
少年闰土教学反思
2014/02/22 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
详解Oracle块修改跟踪功能
2021/11/07 Oracle