详解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 相关文章推荐
javascript显示选择目录对话框的代码
Nov 10 Javascript
取得窗口大小 兼容所有浏览器的js代码
Aug 09 Javascript
php与js的区别是什么
Aug 05 Javascript
基于Css3和JQuery实现打字机效果
Aug 11 Javascript
CSS javascript 结合实现悬浮固定菜单效果
Aug 23 Javascript
JS验证不重复验证码
Feb 10 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
AnglarJs中的上拉加载实现代码
Feb 08 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
Express之托管静态文件的方法
Jun 01 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
Sep 27 Javascript
实例讲解React 组件生命周期
Jul 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
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
PHP6 先修班 JSON实例代码
2008/08/23 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
代码获取历史上的今天发生的事
2014/04/11 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
Python的ORM框架SQLObject入门实例
2014/04/28 Python
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
如何使用Python 打印各种三角形
2019/06/28 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
python代码实现猜拳小游戏
2020/11/30 Python
电脑教师的教学自我评价
2013/11/26 职场文书
自我管理的活动方案
2014/08/25 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL