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 相关文章推荐
javascript 判断中文字符长度的函数代码
Aug 27 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
Oct 08 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
node.js中使用node-schedule实现定时任务实例
Jun 03 Javascript
js实现在网页上简单显示时间的方法
Mar 02 Javascript
Three.js学习之网格
Aug 10 Javascript
Node.js 8 中的重要新特性
Jun 28 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
Jul 07 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
JS实现select选中option触发事件操作示例
Jul 13 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
Javascript实现关闭广告效果
Jan 29 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
在字符串中把网址改成超级链接
2006/10/09 PHP
PHP 一个页面执行时间类代码
2010/03/05 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
jquery实现图片预加载
2015/12/25 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python实现石头剪刀布程序
2021/01/20 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
一文读懂Python 枚举
2020/08/25 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
产假请假条
2014/04/10 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
MySQL数据库简介与基本操作
2022/05/30 MySQL