2019独角兽企业重金招聘Python工程师标准>>>

众所周知,$on是做事件监听,$emit是做事件的派发,但对于$dispatch$broadcast大家可能就比较陌生了,这对api是vue1.x版本的,在vue2.x里已经被废弃

$on$emit

  • $on对于自身触发的事件,也是可以监听的

$dispatch$broadcast

  • $dispatch:用于向上级派发事件,只要是它的父级(一级或多级以上),都可以在组件内通过$on监听到
  • $broadcast: 用于向下级派发事件,只要是它的子组件,都可以在组件内通过$on监听到

如何通过$on$emit来实现$dispatch$broadcast,思路大概是,向上递归查找要通信的组件,或者向下,我们将该功能代码提到mixin中,方便各组件复用

    // emitter.jsconst broadcast = function(comName,event,data) {this.$children.forEach(p =>{if(p.$options.name === comName) {p.$emit(event, data) } else{broadcast.apply(p,comName,event,data)}})}methods: {/*** comName 目标组件* event 事件名* data 要传的数据*/broadcast(comName,event,data) {broadcast.call(this, arguments)},dispatch (comName,event,data) {let parent = this.$parent || this.$root;let name = parent.$options.name;// 这里是找最接近的父组件while (parent && (!name || name !== componentName)) {parent = parent.$parent;if (parent) {name = parent.$options.name;}}if (parent) {parent.$emit.apply(parent, [eventName].concat(params));}},}

使用案例

    // 父组件A,省略部分代码<template><button @click="handleClick">触发事件</button></template><script>import Emitter from '../mixins/emitter.js';export default {name: 'componentA',mixins: [ Emitter ],methods: {handleClick () {this.broadcast('componentB', 'sendMsg', 'Hello 我是父组件A');}}}</script>// 子组件B,省略部分代码<script>import Emitter from '../mixins/emitter.js';export default {name: 'componentB',mixins: [ Emitter ],// 在created或者mounted做事件监听created () {this.$on('sendMsg', this.showMsg)},methods: {showMsg (data) {alert(data)}}}</script>

和原来的api的区别

  • 需要额外传入组件的 name 作为第一个参数;
  • 无冒泡机制;
  • 第三个参数传递的数据,只能是一个(较多时可以传入一个对象),而 Vue.js 1.x 可以传入多个参数,当然,你对 emitter.js 稍作修改,也能支持传入多个参数,只是一般场景传入一个对象足以

转载于:https://my.oschina.net/u/3407699/blog/3049607

最新文章

  1. node-serialport —— Node.js 串口数据读写包
  2. ionic + cordova 使用 cordova-gallery-api 获取本地相册所有图片
  3. Colaboratory挂载google drive的两种网盘
  4. 前端学习(2110):组件化得开发和实现步骤
  5. logrus 输出多个文件_Logrus源码阅读(1)基本用法
  6. python绘制3d动态模型_给大家介绍一个python三维动画制作库,数学作图,数据可视化建模...
  7. uniapp 实现识别图片二维码
  8. The POODLE attack (SSLv3 supported) 漏洞修复
  9. 阿里P6工作四年,女友跑路、晋升无望、年薪45W买不起房,加班加到焦虑!
  10. Hanoi Tower Troubles Again!
  11. java error while loading shared libraries: libjli.so: cannot open shared object file
  12. 【檀越剑指大厂--ElasticSearch】ElasticSearch进阶
  13. HyperLedger Fabric中Fabric-CA的使用
  14. jquery-3.5.1.js net::ERR_ABORTED 404
  15. Typec转HDMI+PD3.0+U3+U2+SD/TF读卡拓展七合一方案设计电路|CS5266+MA8621设计参考电路
  16. html输入框字体字号设置,HTML网页怎么设置文本框里面输入的文字大小
  17. LTE-V2X笔记:一些基础知识
  18. 每条跑道背后,可能都有一个胖子~
  19. 新斗罗大陆手游服务端,自动搭建脚本,有手就可以,
  20. 光学镜头是制作过程阶段理解

热门文章

  1. 博弈论 从懵逼到入门 详解
  2. day01 --环境搭建 注册 表单校验
  3. 一个大四毕业生想对自学Android的大学生说一些话
  4. 瑜伽扭身祈祷式动作教程
  5. 分布式配置管理平台XXL-CONF
  6. sql distinct去除重复
  7. [教程] 康盛创想 Windows (server 2003) 服务器部署标准 白丁简明版
  8. MATLAB中一些特殊的函数
  9. MacOS怎样启用悬停文本功能的具体操作方法!
  10. Ubuntu 18.04 通过 ufw route 配置网关服务器