vue 组件之间事件触发($emit)与event Bus($on)的用法说明


Posted in Javascript onJuly 28, 2020

组件之间事件触发

之前使用组件,并不是很频繁,是水平的问题,目前工作中,公司大佬带着我手写过一个组件,再此很感谢他的指导。目前简单的组件已经有了自己的逻辑思维,正在从低级码农向中级码农蜕变。废话不多说。上图看看组件情况。

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

新增按钮组件:

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

操作按钮组合组件:

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

此时有个需求就是,无论是哪个按钮,如果改变了列表中的数据,列表需要实时更新数据。

此时就需要用到组件间的事件触发。

父子组件之间事件触发可以使用$emit

$emit的使用方法如下:

在子组件中,写一个click点击事件。比如:

cancelCU() {
 this.dialogVisible = false;
 this.$emit('closeAdd')
}

然后在父组件中子组件上,添加一个 @closeAdd="closeAddClick",closeAddClick函数就是执行了。

新增按钮可以使用这种方式。但是操作按钮组合中的组件,就属于孙子组件了,孙子组件执行click事件,列表数据需要刷新,此时通过孙子组件触发父组件事件,父组件触发爷爷组件,就比较麻烦了,此时可以通过event bus实现跨组件的事件触发了。

具体使用方法如下:

第一步:

新建一个js文件,来创建出我们的eventBus,我们把它命名为bus.js

内容如下:

import Vue from 'vue';

export default new Vue();

第二步:

在孙子组件和爷爷组件中,都需要引入这个bus.js

import Bus from 'common/js/bus.js';

孙子组件执行方法如下:

addCart(event) { 
 //如果传递参数的话,可以如下这样写
 Bus.$emit('getTarget', event.target); 
 //如果不传递参数可以如下;
 Bus.$emit('getTarget');
}

这里我们在click组件中每次点击,都会在bus中触发这个名为'getTarget'的事件,并将点击事件的event.target顺着事件传递出去。

接着,我们要在show组件中的created()钩子中调用bus监听这个事件,并接收参数:

created() { 
 //如果传递参数的话,爷爷组件需要这样接收
 Bus.$on('getTarget', target => { 
  console.log(target); 
 }); 
 //如果不传递参数的话,则可以如下处理
 Bus.$on('getTarget',()=>{
 //此处执行对应的函数操作
 })
}

这样,在每次click组件的点击事件中,就会把event.target传递到show中,并console出来。

所以eventBus的使用还是非常便捷的,但是如果是中大型项目,通信比较复杂,还是建议大家直接使用vuex。

补充知识:vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例

vue2中废弃了$dispatch和$broadcast广播和分发事件的方法。父子组件中可以用props和$emit()。如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通信的兄弟组件之中,都引入Bus,之后通过分别调用Bus事件触发和监听来实现组件之间的通信和参数传递。

首先需要在任意地方添加一个bus.js

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

在bus.js里面 写入下面信息

import Vue from 'vue'

export default new Vue;

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

在需要通信的组件都引入Bus.js

如果你的bus.js是自定义一个bus的文件那from后面就改成你的所放的位置

import Bus from './bus.js'

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

接下来就是要组件通信了

添加一个 触发 #emit的事件按钮

<template>
  <div id="emit">
    <button @click="bus">按钮</button>
  </div>
 </template> 

import Bus from './bus.js' 
export default { 
  data() {
    return {
      message: ''"
    }
   },
methods: {
    bus () {
     Bus.$emit('msg', '我要传给兄弟组件们,你收到没有')
    }
  }
}

打开要和$emit通信的另外一个组件 添加

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

在钩子函数中监听msg事件

<template>
  <div id="on">
      <p>{{message}}</p>
  </div>
</template>

import Bus from './bus.js'
export default {
  data() {
   return {
    message: ''
   }
  },
  mounted() {

let self = this
    Bus.$on('msg', (e) => {
     self.message = e


 console.log(`传来的数据是:${e}`)
    })
   }
  }

最后p会显示来自$emit传来的信息

以上这篇vue 组件之间事件触发($emit)与event Bus($on)的用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
Feb 26 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
jQuery地图map悬停显示省市代码分享
Aug 20 Javascript
jQuery Validation PlugIn的使用方法详解
Dec 18 Javascript
js实现随机抽选效果、随机抽选红色球效果
Jan 13 Javascript
JS实现复制功能
Mar 01 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
Jul 12 Javascript
Bootstrap图片轮播效果详解
Oct 17 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
May 20 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
Sep 01 Javascript
JavaScript前端开发时数值运算的小技巧
Jul 28 #Javascript
js实现全选和全不选
Jul 28 #Javascript
浅谈vue中$bus的使用和涉及到的问题
Jul 28 #Javascript
js实现全选和全不选功能
Jul 28 #Javascript
JavaScript React如何修改默认端口号方法详解
Jul 28 #Javascript
vue内置组件component--通过is属性动态渲染组件操作
Jul 28 #Javascript
Postman如何实现参数化执行及断言处理
Jul 28 #Javascript
You might like
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php记录日志的实现代码
2011/08/08 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
深入解析Vue 组件命名那些事
2017/07/18 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
了解重排与重绘
2019/05/29 Javascript
微信小程序—setTimeOut定时器的问题及解决
2019/07/26 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
使用Python实现牛顿法求极值
2020/02/10 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
PHP面试题及答案一
2012/06/18 面试题
高职教师先进事迹材料
2014/08/24 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
看上去很美观后感
2015/06/10 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
Python+Appium新手教程
2021/04/17 Python