详解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 相关文章推荐
HTTP状态代码以及定义(解释)
Feb 02 Javascript
List Installed Hot Fixes
Jun 12 Javascript
js 遍历对象的属性的代码
Dec 29 Javascript
javascript实现的DES加密示例
Oct 30 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
Jul 21 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
Nov 02 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 Javascript
用最少的JS代码写出贪吃蛇游戏
Jan 12 Javascript
使用Javascript简单计算器
Nov 17 Javascript
vue form check 表单验证的实现代码
Dec 09 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
Nov 18 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数据库操作方法(MYSQL版)
2011/06/08 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
python实现文本界面网络聊天室
2018/12/12 Python
python 字符串追加实例
2019/07/20 Python
Python绘图实现显示中文
2019/12/04 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
知识竞赛活动方案
2014/02/18 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
毕业设计致谢词
2015/05/14 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers