解决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 相关文章推荐
js 调整select 位置的函数
Feb 21 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
Dec 12 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
javaScript使用EL表达式的几种方式
May 27 Javascript
javaScript中的原型解析【推荐】
May 05 Javascript
JavaScript lodash常见用法系列小结
Aug 24 Javascript
移动端滑动插件Swipe教程
Oct 16 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
Feb 11 Javascript
laydate日历控件使用方法详解
Nov 20 Javascript
jquery animate动画持续运动的实例
Nov 29 jQuery
jQuery实现适用于移动端的跑马灯抽奖特效示例
Jan 18 jQuery
JavaScript oncopy事件用法实例解析
May 13 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
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
python构造函数init实例方法解析
2020/01/19 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
实习鉴定范文
2013/12/19 职场文书
《恐龙》教学反思
2014/04/27 职场文书
2014年党支部承诺书
2014/05/30 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
2015新学期家长寄语
2015/02/26 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
思想品德课教学反思
2016/02/24 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python