解决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 无符号右移赋值操作
Apr 17 Javascript
JQuery中使用on方法绑定hover事件实例
Dec 09 Javascript
JQuery解析XML数据的几个简单实例
May 18 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
微信小程序 radio单选框组件详解及实例代码
Jan 10 Javascript
jQuery扇形定时器插件pietimer使用方法详解
Jul 18 jQuery
详解layui中的树形关于取值传值问题
Jan 16 Javascript
vue router 用户登陆功能的实例代码
Apr 24 Javascript
layui使用templet格式化表格数据的方法
Sep 16 Javascript
vue如何在项目中调用腾讯云的滑动验证码
Jul 15 Javascript
Postman内建变量常用方法实例解析
Jul 28 Javascript
vue实现公共方法抽离
Jul 31 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数组实例总结与说明
2011/08/23 PHP
php ios推送(代码)
2013/07/01 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
jquery实现加载等待效果示例
2013/09/25 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
深入解析Python中的WSGI接口
2015/05/11 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
Python3 max()函数基础用法
2019/02/19 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
高校自主招生自荐信
2013/12/09 职场文书
物业管理交接协议书
2016/03/24 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
Python之matplotlib绘制折线图
2022/04/13 Python