解决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 在线压缩和格式化收藏
Jan 16 Javascript
javascript 函数调用规则
Aug 26 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
Sep 21 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
javascript中offset、client、scroll的属性总结
Aug 13 Javascript
基于JS2Image实现圣诞树代码
Dec 24 Javascript
分享jQuery插件的学习笔记
Jan 14 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
Jun 14 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
Feb 25 Javascript
Node.js的环境安装配置(使用nvm方式)
Oct 11 Javascript
详细讲解vue2+vuex+axios
May 27 Javascript
vue.js实现带日期星期的数字时钟功能示例
Aug 28 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多维数组遍历方法(2种实现方法)
2015/12/10 PHP
php的debug相关函数用法示例
2016/07/11 PHP
如何离线执行php任务
2017/02/21 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
JavaScript简介
2015/02/15 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
基于python的Paxos算法实现
2019/07/03 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
浅谈react路由传参的几种方式
2021/03/23 Javascript
中专自我鉴定范文
2013/10/16 职场文书
护理学专业推荐信
2013/12/03 职场文书
实验教师岗位职责
2014/02/13 职场文书
公司车队管理制度
2015/08/04 职场文书
老舍《猫》教学反思
2016/02/17 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis