详解vue beforeRouteEnter 异步获取数据给实例问题


Posted in Javascript onAugust 09, 2019

场景: vue-router 路由钩子 beforeRouteEnter 可以用来在初始进入页面前,http 异步获取数据 mockData ,预先判断是进入 A 页、还是 B 页,还是留在本页;而如果留在本页的话,还需要在 mounted 根据 mockData 来判断显示哪种状态(可以在本页面实例创建后,重新发起 http 请求获取 mockData ,但是没有必要,造成代码冗余);

执行顺序:

async beforeRouteEnter(to, from, next) {
   let res = await gameData()
   console.log('beforeRouteEnter start');
   next(vm => {
    console.log("vm start")
    vm.is_exchange = res.is_exchange
    vm.is_finish = res.is_finish
   })
 },
 beforeCreate() {
  console.log("beforeCreate start")
 },
 mounted(){
  console.log('mounted start');
  if(this.is_finish){
   this.modalMsg="活动已结束"
   return;
  }
  if(this.is_exchange){
   this.modalMsg="您已兑换奖品"
   return;
  }
 }

打印结果如下:

beforeRouteEnter start

beforeCreate start

mounted start

vm start

由打印结果,我们可以总结 beforeRouteEnter 钩子确实在 vue 实例创建前执行,但是其 next 函数中 vm 回调不是同步执行,而是等到 mounted 执行完之后,才执行 。

症结:因为我们要根据 mockData 中的 is_exchange 和 is_finish 参数来判断决定页面初始状态,此过程需要在 mounted 中执行;但是 mounted 执行时, vm 还未执行,即 mounted 拿不到

is_exchange 和 is_finish 这两个值,这样就造成了冲突;

解决:在 next 中 打印 vm ,发现 vm 就是当前 vue 实例对象,即可以使用 vm 调用所有当前实例的变量和方法;那依次,能否将判断逻辑写入 methods 中一个方法中,使用 vm 来调用呢?

async beforeRouteEnter(to, from, next) {
   let res = await gameData()
   console.log('beforeRouteEnter start');
   next(vm => {
    console.log("vm start")
    vm.is_exchange = res.is_exchange
    vm.is_finish = res.is_finish

    vm.judge();//赋值之后,此处调用判断方法
   })
 },
 beforeCreate() {
  console.log("beforeCreate start")
 },
 mounted(){
  console.log('mounted start');
 },
 methods:{
  judge(){// 将判断逻辑写入judge方法
  if(this.is_finish){
   this.modalMsg="活动已结束"
   return;
  }
  if(this.is_exchange){
   this.modalMsg="您已兑换奖品"
   return;
  }
  }
 }

至此,问题解决。有同学可能会问,在 vm 中调用 judge 方法时, mounted 已执行,此时页面已渲染,再去判断初始状态,会不会有闪烁问题?本人经过测试,发现不会,据此推断,在 mounted 执行结束之后,页面没有开始更新动作,而是在执行完 vm 回调之后,再去渲染。这样的话,逻辑上就行得通了,但是这个只是推断,还需要在源码层面找到依据才可以。

github地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE 上下滚动展示模仿Marquee机制
Dec 20 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
javascript图片预加载实例分析
Jul 16 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
Feb 25 Javascript
详解Node.js如何开发命令行工具
Aug 14 Javascript
vue图片加载与显示默认图片实例代码
Mar 16 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
Phaser.js实现简单的跑酷游戏附源码下载
Oct 26 Javascript
JavaScript常见事件对象与操作实例总结
Jan 05 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
Sep 19 Javascript
JS实现的雪花飘落特效示例
Dec 03 Javascript
JS控制下拉列表左右选择实例代码
May 08 Javascript
微信小程序如何连接Java后台
Aug 08 #Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 #Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
Aug 08 #Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
Aug 08 #Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 #jQuery
微信小程序嵌入腾讯视频源过程详解
Aug 08 #Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 #Javascript
You might like
动易数据转成dedecms的php程序
2007/04/07 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
js实现交通灯效果
2017/01/13 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
python定时器(Timer)用法简单实例
2015/06/04 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
python实现员工管理系统
2018/01/11 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
创联软件面试题笔试题
2012/10/07 面试题
客服工作职责
2013/12/11 职场文书
十八大闭幕感言
2014/01/22 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
运动会800米赞词
2015/07/22 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电