vue-自主研发非父子关系组件之间通信的问题
相信很多人都知道解决组件间通信:vuex,今天的主角不是它。
element-ui里解决组件间通信的思路:emitter.js ,但是如果你拿来你会发现它解决的是父子组件之间的通信问题。如果我们通信的组件不是父子关系,emitter.js 就不能做到了。
首页,还是要借鉴前人(emitter)的思路。其实vuex也可以用状态来解决这个问题,我觉得可以不一定要依赖vuex,而且走store繁琐。
我们的需求就是非父子关系之间简单的事件通信
现实项目中的一个需求,在“库位列表”的页面操作,通知菜单“库位列表”里的事件。

我们再看看,页面组件渲染图,elmenu 和 stockposition 发现它们并不是父子关系,但是它们的共有父亲节点是ElContainer,这是我们的突破口:

方案实现思路:我们先找到父亲节点,我定义寻找的父亲节点:app,然后递归遍历子节点,找到通信目标组件,直接上代码 emitter.js:
export default {
methods: {
dispatchComponent(componentName, eventName, params) {
var parent = this.$parent || this.$root , com = null;
var name = parent.$options.name;
// 找到顶级app父亲节点
while (parent && (!name || name !== componentName) && name!="app") {
parent = parent.$parent;
if (parent) {
name = parent.$options.name;
}
}
// 递归遍历子节点,找到componentName
let recursiveChild = (parent) => {
parent.$children.filter(child=>{
if(child.$options.name==componentName) {
com = child;
} else {
recursiveChild(child);
}
})
}
recursiveChild(parent);
if (com) {
com.$emit.apply(com, [eventName].concat(params));
}
}
}
}
elmenu.vue 组件代码

stockposition.vue 组件代码

最后效果:

vue-自主研发非父子关系组件之间通信的问题的更多相关文章
- Vue 组件&组件之间的通信 之 非父子关系组件之间的通信
Vue中不同的组件,即使不存在父子关系也可以相互通信,我们称为非父子关系通信: 我们需要借助一个空Vue实例,在不同的组件中,使用相同的Vue实例来发送/监听事件,达到数据通信的目的: 实例: 初始加 ...
- Vue_(组件通讯)非父子关系组件通信
Vue单项数据流 传送门 Vue中不同的组件,即使不存在父子关系也可以相互通信,我们称为非父子关系通信 我们需要借助一个空Vue实例,在不同的组件中,使用相同的Vue实例来发送/监听事件,达到数据通信 ...
- vue单文件组件形成父子(子父)组件之间通信(vue父组件传递数据给子组件,子组件传递数据给父组件)
看了很多文章,官网文档也有看,对父子组件通信说的不是很明白:决定自己总结一下: vue一般都使用构建工具构建项目:这样每个组件都是单文件组件:而网上很多文章都是script标签方式映入vue,组件通信 ...
- 【Vue课堂】Vue.js 父子组件之间通信的十种方式
这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...
- 前端面试 vue 部分 (5)——VUE组件之间通信的方式有哪些
VUE组件之间通信的方式有哪些(SSS) 常见使用场景可以分为三类: 父子通信: null 父向子传递数据是通过 props ,子向父是通过 $emit / $on $emit / $bus Vuex ...
- vue组件之间通信总结(超详细)
组件通信在我们平时开发过程中,特别是在vue和在react中,有着举足轻重的地位.本篇将总结在vue中,组件之间通信的几种方式: props.$emit $parent.$children $attr ...
- vue工程利用pubsub-js实现兄弟组件之间的通信
前言 项目是基于vue-cli创建的,不会搭建vue开发环境的同学可以百度,这里不再赘述. 步骤流程 vue项目搭建完成之后的文件图如下: 我的上一篇博客已经详细叙述vue工程中各个文件的作用,不清楚 ...
- RXJS组件间超越父子关系的相互通信
RXJS组件间超越父子关系的相互通信 用到这个的需求是这样的: 组件A有数据变化,将变化的数据流通知组件B接收这个数据流并做相应的变化 实例化RXJS的subject对象 import { Injec ...
- Vue 组件之间通信 All in One
Vue 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 https://stackblitz.com/edit/vue-parent-child-commutation?fil ...
随机推荐
- [05-01]Linux如何重启系统
/* 私人笔记 */ 1.在linux相关路径下J2EE上传代码,指令:svn update : 2. 若项目名在linux中的目录为Scorpius ,跟新代码目录地址为 cd /home/xagd ...
- 单片机stm32小白入门级学习路线“图”
学习stm32的是真的越来越多了,当然我也是其中语言,所以对于stm32的学习路线非常的感兴趣,所以我也分享一下 虽然是盗图吧 不过也算是分享 ,下边有觉得不错的视频资料 也奉上 (stm ...
- java web 下载本地文件并弹出下载框
window.open("/dept/download") jsp代码 @RequestMapping(value = "/download", method ...
- Linux升级python3之后yum不能正常使用解决方法一:重新配置yum源
[转]linux下yum安装及配置 分步阅读 公司使用的是linux搭建服务器,linux安装软件能够使用yum安装依赖包是一件非常简单而幸福的事情,所以这里简单介绍一下linux安装yum源流程和操 ...
- Luogu4113 [HEOI2012]采花
题目大意:给定一个长度为$n$的序列$a_i$,$m$次询问,每次询问$[l,r]$,求在区间内有多少个数出现了至少2次. 数据范围:$1\leq l\leq r\leq n\leq 2*10^6,1 ...
- 搭建docker私有仓库
保存镜像的地方成为仓库(registry).目前有2种仓库:公共仓库和私有仓库. 最方便的是使用公共仓库上传和下载镜像,下载不需要注册,上传需要到公共仓库注册.公共仓库网站:https://hub.d ...
- [js]d3.js绘制拓扑树
echart也支持拓扑树了 所需的json数据格式: children嵌套 vis.js也支持绘制拓扑树 数据格式: nodes: {id, label, title} edges: {from, t ...
- Azure基础(三)- Azure的物理架构和服务保证
Azure fundamentals - Core Cloud Services - Azure architecture and service guarantees Azure provides ...
- Oracle debug
执行慢的使用使用debug环境变量,可以收集详细的日志 rootcrs.pl/roothas.pl执行慢 参考如下文档设置debug环境变量,重现问题并收集详细日志. How to turn on r ...
- (转载)MyBatis传入多个参数的问题
原文地址:https://www.cnblogs.com/mingyue1818/p/3714162.html 一.单个参数: public List<XXBean> getXXBeanL ...