详解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 相关文章推荐
js css样式操作代码(批量操作)
Oct 09 Javascript
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
Oct 16 Javascript
javascript中节点的最近的相关节点访问方法
Mar 20 Javascript
extjs表格文本启用选择复制功能具体实现
Oct 11 Javascript
js使用心得分享
Jan 13 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
Apr 16 Javascript
jQuery标签编辑插件Tagit使用指南
Apr 21 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
Jun 30 Javascript
JavaScript的==运算详解
Jul 20 Javascript
代码详解javascript模块加载器
Mar 04 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 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网站提速三大“软”招
2006/10/09 PHP
php生成文件
2007/01/15 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
使用python实现飞机大战游戏
2020/03/23 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
日期和时间问题
2015/01/04 面试题
美发店5.1活动方案
2014/01/24 职场文书
成龙洗发水广告词
2014/03/14 职场文书
三八节主持词
2014/03/17 职场文书
班主任对学生的评语
2014/04/26 职场文书
关于保护环境的建议书
2014/05/13 职场文书
民事上诉状范文
2015/05/22 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android