记一笔vue中的中央事件总线的问题,以及解决方案
代码结构:首先HeaderNav组件是被单独拎出来的,router-view中就对应了内容组件,由于有时候i有的界面的header内容是不一样的,因此要用到兄弟组件的相互通信,这个时候我首先选择了bus[中央事件总线]
<div class="" v-if="!showScan">
<HeaderNav/>
<router-view/>
</div>
问题描述:就是在页面上用按钮点击切换路由的时候了,header是可以正常切换的,但是如果是地址栏上直接输入路由进入的时候了,就驴头不对马口了。
HeaderNav.vue中逻辑代码
methods: {.....
watchChangeHeader () {
this.bus.$on('changeHeader', info => {
debugger
if (info) {
setInStorage('headerLag',info.headerLag)
this.headerLag = info.headerLag
setInStorage('title',info.title)
this.title = info.title
} else {
this.headerLag =''
setInStorage('headerLag','')
}
})
}
.....
}
mounted() {
this.watchChangeHeader()
},
内容组件的逻辑代码:
created () {
console.log('framework created')
this.bus.$emit('changeHeader','')
}
以上只是代码片段....
首先要进行科普下:
1)$emit时,必须已经$on,否则将无法监听到事件,也就是说对组件是有一定的同时存在的要求的
这个可能就是问题的原因,问题就是在一个组件$emit()的时候,他的兄弟组件并没有$on(),这就无法导致能够响应,因此我就改了下代码,将HeaderNav.vue,果然问题解决了。。。
created() {
this.watchChangeHeader()
},
但是我还有一个疑问???为什么页面点击按钮切换路由是正确的,但是直接输入路由就不行啦?????
经过一翻手动验证,发现了这一问题的原因。在页面点击按钮切换路由的时候,我们重新渲染的只是<router-view />这个路由组件对应的内容,由于HederBNav这个组件一直存在不会重新的created,mounted,意思就是说在嫩内容组件$emit的时候,HeaderNav组件的$on一直存在,所以没问题。但是如果我们直接地址栏上输入路由地址进行页面切换,本质上已经不是单页面了,这会造成整个代码会重新加载运行,这个时候在内容组件created()发出$emit(),HeaderNav还没有被挂在完成(mounted),也就不存在$on,所以就会有问题。
记一笔vue中的中央事件总线的问题,以及解决方案的更多相关文章
- Vue开发中的中央事件总线
在Vue开发中会遇到大量的组件之间共享数据的情形,针对不同的情形,Vue有相对应的解决方案.比如,父组件向子组件传值可以使用props,复杂项目中不同模块之间传值可以使用Vuex.但是,对于一些简单的 ...
- Vue bus的使用(兄弟|非父子组件传值)-->可以使用一个空的Vue实例作为中央事件总线new Vue()
1.在main.js中注册全局的bus Vue.prototype.bus=new Vue(); 2.在组建中使用 子组建使用:this.bus.$emit('自定义事件名',data) metho ...
- 如何在 pyqt 中实现全局事件总线
前言 在 Qt 中可以使用信号和槽机制很方便地实现部件之间的通信,考虑下面这样的场景: 我想要点击任意一个专辑卡并通知主界面跳转到专辑界面,那么一种实现方式如上图所示:点击任意一个蓝色方框所示的专辑卡 ...
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)
昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...
- vue笔记 - 组件间通信 之 中央事件总线bus
中央事件总线 - 就是一个名字可以叫做bus的vue空实例,里边没有任何内容: var bus = new Vue(); 人如其名,她就像一个公交车一样,来回输送人,将a站点的A输送到b站点,再将b站 ...
- vue组件之间的传值——中央事件总线与跨组件之间的通信($attrs、$listeners)
vue组件之间的通信有很多种方式,最常用到的就是父子组件之间的传值,但是当项目工程比较大的时候,就会出现兄弟组件之间的传值,跨级组件之间的传值.不可否认,这些都可以类似父子组件一级一级的转换传递,但是 ...
- vue bus 中央事件总线
1.全局定义bus 新建src/eventBus.js 文件 import Vue from 'vue' export default new Vue() // 全局引入mai.jsvue中央事件总 ...
- Vue学习之--------全局事件总线(2022/8/22)
文章目录 1.全局事件总线基础知识(GlobalEventBus) 2.图解过程 3.代码实例 3.1 main.js 3.1 App.vue 3.2 School.vue 3.3 Student.v ...
- vue中央事件总线eventBus的简单理解和使用
公共事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信.它是实现非父子组件通信的一种解决方案. 用法如下: 第一步:项目中创建一个js文件(我通 ...
随机推荐
- word2016_添加标题和目录
标题 开始->标题(层级可选) 目录 引用->目录->自动目录
- IOS加载PDF文件
今天的任务是:在iOS上加载显示pdf文件. 方法一:利用webview -(void)loadDocument:(NSString *)documentName inView:(UIWebView ...
- percona innobackupex 遇到 connect to MySQL server as DBD::mysql module is not installed 问题
percona innobackupex connect to MySQL server as DBD::mysql module is not installed [root@mysql softw ...
- pulltoRefresh类图
- CMD命令提示符下选中文字即可以复制和SecureCRT一样
用过 SecureCRT 的都会觉得复制粘贴很方便.只要选中相应文字,会自动复制.然后点鼠标右键就可以粘贴,非常方便. 但是在windows系统下的CMD里面,每次都要点鼠标右键→标记,再选中相应文字 ...
- SpringMVC札集(03)——基于注解的SpringMVC入门完整详细示例
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
- 使用tr1的bind函数模板
最近把公司的VS2008统一升级为SP1了,虽然还是有些跟不上时代,毕竟C++17标准都出了,但是,对于成熟的商业软件开发而言,追求更新的C++标准肯定不是正道.升级SP1的VS2008可以支持TR1 ...
- Bluetooth(android 4.2.2版本)
Android provides a default Bluetooth stack, BlueDroid, that is divided into two layers: The Bluetoot ...
- 【剑指offer】找出数组中任意一个重复的数字,C++实现
原创博文,转载请注明出处! # 题目 # 思路 对于长度为n的数组,范围为0~n-1的数字而言,如果不粗在重复数字,则排序后数组元素和数组角标相同.如果存在重复数字,则在排序的过程中会出现不同下标对应 ...
- CFE Bootloader详解 — 引导过程
CFE命令 CFE引导过程 系统加电后,CFE从boot.S (src/shared/boot.S)开始执行,完成判断芯片类型.设置时钟.初始化缓存.把自身加载进RAM等任务后,跳转到c_main() ...