详解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 相关文章推荐
jquery创建div 实现代码
Apr 27 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
Apr 16 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
JavaScript学习笔记之基础语法
Jan 22 Javascript
浅谈js构造函数的方法与原型prototype
Jul 04 Javascript
jQuery实现定位滚动条位置
Aug 05 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
Sep 21 Javascript
bootstrap读书笔记之CSS组件(上)
Oct 17 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
React组件中的this的具体使用
Feb 28 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 07 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
python 三元运算符使用解析
2019/09/16 Python
Python tcp传输代码实例解析
2020/03/18 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
夏季药店促销方案
2014/08/22 职场文书
2014年党务工作总结
2014/11/25 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
Python 视频画质增强
2022/04/28 Python
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers