当前位置: 首页 > news >正文

vue组件跳层级时的事件处理 (事件的广播与派发)

相信大家一定用过elementui这个组件库,那么对里面的表单组件一定不陌生。

最常用的几个组件就是el-formel-form-itemel-input,表单校验时的错误提示功能是交给el-form-item来实现的。当el-input填写时触发校验规则,验证失败后通知el-form-item进行错误信息提示。

他们大多时候是处于爷——父——子的关系,但是这个关系并不是完全固定的。我自己在使用的时候经常也不仅仅只使用这三个组件,简单举个例子:

<el-form><el-form-item><MyDiv><el-input></el-input></MyDiv></el-form-item>
</el-form>

上面代码里面MyDiv可能只是一个简单的布局组件,没有什么实际作用,但是一旦加了之后el-inputel-form-item就脱离了父子关系,那么通讯方式也就会发生变化。如果之前el-input校验规则失败后使用的是this.$parent的方式去触发校验提示的话,当我们在他们之间添加其他组件后就会失效。并且这是不可控的,你无法预料他们可能被如何实现,甚至之间间隔了多少个组件,若是强硬的将两个组件封装在一起又会显得臃肿冗余,不符合组件封装的规范,所以这个时候就可以使用派发来实现。

dispatch 派发

我们直接看elementui源码时如何使用派发的方式解决我们上面提到的问题

dispatch(componentName, eventName, params) {var parent = this.$parent || this.$root;var name = parent.$options.componentName;while (parent && (!name || name !== componentName)) {parent = parent.$parent;if (parent) {name = parent.$options.componentName;}}if (parent) {parent.$emit.apply(parent, [eventName].concat(params));}}

可以看出elementui其实就是遍历了父级组件,一直遍历拿到想要的组件为止。找到需要的组件后直接$emit派发事件,那么肯定在他们父级组件内部一定会有$on进行着事件监听。需要注意的是componentName这个属性是elementui自己在组件添加的,我们使用的时候直接使用name即可,name就是我们定义组件时自己定义的name

broadcast 广播

broadcast(componentName, eventName, params) {this.$children.forEach(child => {var name = child.$options.componentName;if (name === componentName) {child.$emit.apply(child, [eventName].concat(params));} else {broadcast.apply(child, [componentName, eventName].concat([params]));}});
}

broadcast与dispatch 实现逻辑没什么区别,只是一个向上遍历进行派发,一个向下遍历进行广播。

http://www.lryc.cn/news/107150.html

相关文章:

  • 毫米波雷达 TI IWR6843 官方测试程序(Out Of Box Demo)
  • 中大标了 5813万
  • Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业 tbms
  • RocketMQ安装和简单使用
  • Codeforces Round 869 (Div. 2)
  • 【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 3
  • CTFSHOW php 特性
  • 2、认识O(nlogn)的排序
  • 什么是 HTTP 长轮询?
  • 操作系统用户态和核心态和CPU上下文切换
  • TSINGSEE青犀视频汇聚平台EasyCVR视频广场面包屑侧边栏支持拖拽操作
  • RocketMQ发送消息超时异常
  • WordPress做权重站:二级目录伪静态写法
  • 浅谈下API初步认知
  • LeetCode--剑指Offer75(2)
  • 基于vue-cli3的vue项目 通过postcss-pxtorem 实现px自动转换成rem并解决版本问题
  • 前端开发常用的方法封装(二)
  • 【Java】Springboot脚手架生成初始化项目代码
  • LLaMA系列 | LLaMA和LLaMA-2精简总结
  • 运动蓝牙耳机什么款式好、适合运动的蓝牙耳机推荐
  • 在敏捷项目中如何做好资源规划?
  • mybatis-plus 用法
  • 重测序数据分析流程丨操作步骤与代码与代码脚本
  • npm -v无法显示版本号
  • 【Vue】父子组件值及方法传递使用
  • 医药化工企业洁净厂房改造消防防爆安全的重要性
  • Web开发中防止SQL注入
  • 【LeetCode-中等】剑指 Offer 35. 复杂链表的复制(详解)
  • QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 -第一篇
  • Cat.1如何成为物联网业务加速器?