详解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如何判断某元素是否具备指定的样式
Nov 05 Javascript
判断访客终端类型集锦
Jun 05 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
Jan 23 Javascript
form表单转Json提交的方法(推荐)
Sep 23 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
Aug 23 jQuery
node 命令方式启动修改端口的方法
May 12 Javascript
jquery使用FormData实现异步上传文件
Oct 25 jQuery
在Layui中实现开关按钮的效果实例
Sep 29 Javascript
vue实现鼠标移过出现下拉二级菜单功能
Dec 12 Javascript
JS绘图Flot应用图形绘制异常解决方案
Oct 16 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 判断常量,变量和函数是否存在
2009/04/26 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
PHP教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
Python爬虫代理IP池实现方法
2017/01/05 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
python实现批量图片格式转换
2020/06/16 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
法律专业个人实习自我鉴定
2013/09/23 职场文书
小学教育毕业生自荐信
2013/11/18 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
土建施工员岗位职责
2014/07/16 职场文书
食品安全演讲稿
2014/09/01 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
2014年化验员工作总结
2014/11/18 职场文书
爱的教育读书笔记
2015/06/26 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
外出培训学习心得体会
2016/01/18 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python