解决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 相关文章推荐
jQuery学习笔记 操作jQuery对象 属性处理
Sep 19 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
May 08 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
Mar 03 Javascript
Actionscript与javascript交互实例程序(修改)
Sep 22 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
利用JS实现页面删除并重新排序功能
Dec 09 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
Dec 19 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
bootstrap轮播模板使用方法详解
Nov 17 Javascript
dts文件中删除一个node或属性的操作方法
Aug 05 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 Javascript
JS实现动态无缝轮播
Jan 11 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的Reflection反射机制
2014/08/05 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
Python中的time模块与datetime模块用法总结
2016/06/30 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
父亲八十大寿答谢词
2014/01/23 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
2014年维修工作总结
2014/11/22 职场文书
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫