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