记一笔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文件(我通 ...
随机推荐
- 外层页面与iframe相互调用的方法
iframe调用外层页面的方法: parent.func(); 外层页面调用里面的iframe中的内容方法: $("iframe").contents().find(" ...
- 《The Cg Tutorial》阅读笔记——凹凸贴图 Bump Mapping
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/5018103.html 凹凸贴图 Bump Mapping 一.简介 凹凸贴图用于在不 ...
- 11g OCM自动打补丁
1.先替换掉OPatch软件 每个实例都要运行 GRID_HOME和ORACLE_HOME的OPatch目录都去除掉 把OPatch软件p6880880_112000_Linux-x86-64.zip ...
- ActiveMQ教程(简介与安装)
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久 ...
- 【2018多校第一场】hdu6308-Time Zone(日期)
Problem Description Chiaki often participates in international competitive programming contests. The ...
- Frequently-Used Network Time Server(Base On NTP:Network Time Protocol)
国家授时中心服务器 210.72.145.44 133.100.11.8 日本福冈大学 time-a.nist.gov 129.6 ...
- 如何自定义FileZilla编辑文件的默认打开方式
看一下设置: 原来是人家默默认不给我们提示 改一下: 还是不行,还是跳到网页去了 还是不行 这样就好了...
- APUE学习笔记——8.1-8.4 进程基础
进程ID 1 进程id是唯一的.(不会有进程id一样的两个进程) 2进程id是可复用的,一个进程销毁后,它的id号可以被新的进程使用.但是Unix采用了延迟复用的算法,也就是进程 销毁后它的id不 ...
- 用css和php脚本来使得poscms的list标签顺利输出记录
每次拿到前端给的页面,都会有意想不到的惊喜,因为他们给的页面总是不能很好地契合poscms的模板标签 输出规范,这时候就需要动点脑筋去解决问题了. 拿前两天拿到的一类(对,你没看错,是一类)页面来说吧 ...
- EasyNVR网页/微信播放RTSP摄像机HLS/RTMP播放时出现起播等待问题的优化过程
EasyNVR 项目中, 我们需要在网页/微信中嵌入 HLS 播放器, 实现直播效果. 开发过程中, 我们调研了很多HLS播放器, 包括 百度cyberplayer, ckplayer, flowpl ...