详解vue之自行实现派发与广播(dispatch与broadcast)


Posted in Vue.js onJanuary 19, 2021

要解决的问题

主要针对组件之间的跨级通信

为什么要自己实现dispatch与broadcast?

因为在做独立组件开发或库时,最好是不依赖第三方库

为什么不使用provide与inject?

因为它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。
然后有两种场景它不能很好的解决:
父组件向子组件(支持跨级)传递数据;
子组件向父组件(支持跨级)传递数据。

代码如下:

emitter.js

function broadcast(componentName, eventName, params) {
 this.$children.forEach(child => {
  const name = child.$options.name;

  if (name === componentName) {
   child.$emit.apply(child, [eventName].concat(params));
  } else {
   // todo 如果 params 是空数组,接收到的会是 undefined
   broadcast.apply(child, [componentName, eventName].concat([params]));
  }
 });
}
export default {
 methods: {
  dispatch(componentName, eventName, params) {
   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));
   }
  },
  broadcast(componentName, eventName, params) {
   broadcast.call(this, componentName, eventName, params);
  }
 }
};

parent.vue

<template>
 <div>
  <h1>我是父组件</h1>
  <button @click="handleClick">触发事件</button> <child />
 </div>
</template>
<script>
import Emitter from "@/mixins/emitter.js";
import Child from "./child";
export default {
 name: "componentA",
 mixins: [Emitter],
 created() {
  this.$on("child-to-p", this.handleChild);
 },
 methods: {
  handleClick() {
   this.broadcast("componentB", "on-message", "Hello Vue.js");
  },
  handleChild(val) {
   alert(val);
  }
 },
 components: {
  Child
 }
};
</script>

child.vue

<template>
 <div>我是子组件</div>
</template>
<script>
import Emitter from "@/mixins/emitter.js";
export default {
 name: "componentB",
 mixins: [Emitter],
 created() {
  this.$on("on-message", this.showMessage);
  this.dispatch("componentA", "child-to-p", "hello parent");
 },
 methods: {
  showMessage(text) {
   window.alert(text);
  }
 }
};
</script>

这样就能实现跨级组件自定义通信了,但是,要注意其中一个问题:订阅必须先于发布,也就是说先有on再有emit

父子组件渲染顺序,实例创建顺序

子组件先于父组件前渲染,所以在子组的mounted派发事件时,在父组件中的mounte中是监听不到的。
而父组件的create是先于子组件的,所以可以在父组件中的create可以监听到

到此这篇关于详解vue之自行实现派发与广播(dispatch与broadcast)的文章就介绍到这了,更多相关vue 派发与广播内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
Vue ​v-model相关知识总结
Jan 28 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
Vue实现下拉加载更多
May 09 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 #Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 #Vue.js
vue element el-transfer增加拖拽功能
Jan 15 #Vue.js
Vue实现多页签组件
Jan 14 #Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 #Vue.js
Vue中引入svg图标的两种方式
Jan 14 #Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 #Vue.js
You might like
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
php的一个登录的类 [推荐]
2007/03/16 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python生成随机mac地址的方法
2015/03/16 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
应用艺术专业个人的自我评价
2014/01/03 职场文书
单身联谊活动方案
2014/01/29 职场文书
求职意向书
2014/07/29 职场文书
报案材料怎么写
2015/05/25 职场文书
演讲开场白台词大全
2015/05/29 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python