解决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 setCapture 区域外事件捕捉
Mar 18 Javascript
Javascript和Java获取各种form表单信息的简单实例
Feb 14 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
jQuery stop()用法实例详解
Jul 28 Javascript
Highcharts学习之数据列
Aug 03 Javascript
基于angularJS的表单验证指令介绍
Oct 21 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
Aug 04 jQuery
vue教程之toast弹框全局调用示例详解
Aug 24 Javascript
Vue-Router实现组件间跳转的三种方法
Nov 07 Javascript
浅析Angular 实现一个repeat指令的方法
Jul 21 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 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引用返回用法示例
2016/05/28 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
react-router实现按需加载
2017/05/09 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
Scrapy框架使用的基本知识
2018/10/21 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
土地租赁协议书
2015/01/29 职场文书
撤诉申请怎么写
2015/05/19 职场文书
经销商会议开幕词
2016/03/04 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
手写实现JS中的new
2021/11/07 Javascript
Go并发4种方法简明讲解
2022/04/06 Golang
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript