解决vue bus.$emit触发第一次$on监听不到问题


Posted in Javascript onJuly 28, 2020

$emit与emit与emit与 $on的用法

新建bus.js

import Vue from 'vue'

export const bus = new Vue()

引用bus.js

import {bus} from './bus'

bus.$on('test', function (msg) {
 console.log(msg)
})
 
bus.$emit('test', 11)

bus.$emit触发第一次emit触发第一次emit触发第一次 $on监听不到

因为$emit 先于 $on 执行了,VUE并没有储存监听事件,所以无法监听到数据。

我这里遇到的是在调用$emit的时候子组件并没有创建,所以无法监听到数据,子组件创建之后,便可以监听到传递过来的数据

我的解决方法是在调用$emit的时候使用emit的时候使用emit的时候使用 $nextTick()方法

用法:将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

new Vue({
 // ...
 methods: {
 // ...
 example: function () {
  // DOM 还没有更新
  this.$nextTick(function () {
  // DOM 现在更新了
  bus.$emit('test', 11)
  })
 }
 }
})

避免路由跳转多个组件重复监听,只需要在路由跳转之前移除当前组件监听事件即可:

beforeDestroy () {
 // 销毁监听事件
 this.$bus.$off('test')
 }

补充知识:组件之间使用this.$bus.$on传值之前需要先this.$bus.$off注销事件

this.$bus是全局变量

a、b是两个父组件,c是子组件。

c页面触发事件:

this.$bus.$emit(event)

a、b页面监听c组件的事件

pagea:

this.$bus.$on(event, () => {
 this.status = 'reserve'
})

pageb:

this.$bus.$on(event, () => {
  this.status = 'buying'
})

如果在调用了a页面之后,再调用b页面,回导致this.status是reserve而不是我们想要的buying。

正确写法:

pagea:

this.$bus.$off(event).$on(event, () => {
 this.status = 'reserve'
})

pageb:

this.$bus.$off(event).$on(event, () => {
  this.status = 'buying'
})

以上这篇解决vue bus.$emit触发第一次$on监听不到问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 调试利器 Firebug使用详解六
Jul 05 Javascript
调用HttpHanlder的几种返回方式小结
Dec 20 Javascript
jQuery ajax serialize() 方法使用示例
Nov 02 Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 Javascript
jquery实现用户打分评分特效
May 28 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
JavaScript编写推箱子游戏
Jul 07 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
AngularJS创建自定义指令的方法详解
Nov 03 Javascript
详解express + mock让前后台并行开发
Jun 06 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
JS面向对象编程实现的拖拽功能案例详解
Mar 03 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
Jul 28 #Javascript
vue实现虚拟列表功能的代码
Jul 28 #Javascript
vue.js 解决v-model让select默认选中不生效的问题
Jul 28 #Javascript
Vue2.0 $set()的正确使用详解
Jul 28 #Javascript
JavaScript 监听组合按键思路及代码实现
Jul 28 #Javascript
JavaScript动画实例之粒子文本的实现方法详解
Jul 28 #Javascript
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 #Javascript
You might like
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
python连接字符串的方法小结
2015/07/13 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
python开发一款翻译工具
2020/10/10 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
Linux内核产生并发的原因
2016/11/08 面试题
客服工作职责
2013/12/11 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
Django中session进行权限管理的使用
2021/07/09 Python