详解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的tree组件
Dec 03 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
Vue3.0 手写放大镜效果
Jul 25 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
vue中 this.$set的使用详解
Nov 17 Vue.js
分享一个vue实现的记事本功能案例
Apr 11 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
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
初识PHP中的Swoole
2016/04/05 PHP
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
详解AngularJS之$window窗口对象
2018/01/17 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
python递归实现快速排序
2018/08/18 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
大学生写自荐信的技巧
2014/01/08 职场文书
青年教师培训方案
2014/02/06 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
退伍军人感言
2015/08/01 职场文书
创业计划之特色精品店
2019/08/12 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
MySQL大小写敏感的注意事项
2021/05/24 MySQL