Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转
问题引入
试想这样一个业务场景:
在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功,
则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息。
难点所在
需要注意的是,这里并没有单独的接口用于判断用户是否通过校验,而是若用户通过校验,接口就直接返回了用户需要的详情信息,未通过校验则不会返回详情信息并报错。
常见方案问题分析
(一)用户点击按钮后直接跳转到详情页面,在详情页面的created钩子函数中发起ajax请求获取数据
问题在于:
若用户未通过校验,也会先跳转到详情页面,然后再报错,
而我们的目标是先判断是否成功,成功了再进行路由跳转。
(二)将详情页面写在弹窗中,不进行路由跳转。在当前页面发起请求,成功则在弹窗中展示详情数据,失败了则不展示弹窗
问题在于:
弹窗中的内容特别多的情况下,排版不容易,很容易难看,毕竟弹窗一般适用于展示少量数据 ,
并且产品的设计要求可能就是需要单独页面展示,不允许使用弹窗。
另外,如果路由和页面都已经写好了,再去写弹窗也会额外增加不少工作量
(三)发两次请求:当前页面发起第一次请求,失败了不进行跳转;成功了在详情页面再发起一次请求,获取详情数据
这种方式肯定可行,但是问题在于:
同一个api发送了两次请求,多发一次请求白白耗费了网络资源
(四)当前页面发起请求,失败了进行错误提示;成功了,则跳转到详情页面,并通过Vuex或者空组件实现非父子组件通信的方式将数据携带至详情页面展示
这种方式的问题在于:
Vuex的设计目标是存储系统各组件共用的状态,例如用户登录状态、菜单伸缩收起状态,
这里仅有两个组件,采用Vuex有种大炮打蚊子的感觉,使用空组件事件传值实现非父子组件通信
会略显繁琐。并且这两种方式加大了系统复杂度,也容易有新坑。
(五)浏览器缓存
不用说,更加繁琐了,也偏离更远了。
推荐解决方案:使用Vue Router的beforeRouteEnter路由导航守卫
(一)beforeRouteEnter简介:
它本质上,类似于Vue.js的生命周期钩子函数。它在新路由被确认前被调用,可以在里面进行数据处理,发起ajax获取数据,甚至是取消导航。当调用该守卫时,页面仍停留在原页面。该守卫执行完毕后(包括异步获取数据),才会跳转到新页面。
(二)使用案例
在详情组件中使用beforeRouterEnter路由守卫:
import $axios from '@/libs/axios';
import api from '@/api';
export default {
name:'testComponent',
data(){
return {};
},
beforeRouteEnter(to, from, next) {
$axios
.get(api.GetQueueSettingDetail, {
params: {
waybillKey: to.params.pickCode,
warehouseType: 11
}
})
.then(resp => {
if (resp.success) {
next(vm => {
vm.carInfo = resp.result;
});
} else {
next(false);
}
})
.catch(() => {
next(false);
});
},
}
在以上案例中,在新路由被确认前,先发起ajax请求,若成功,就将数据赋值给该组件的carInfo,并跳转到新路由。若失败,调用next(false)回调函数取消导航,页面仍停留在原页面。
该方案相对来说,比较圆满的实现了开篇所提的业务需求,并且没有额外的开销。
(三)参数说明
三个参数
- to 即将要进入的目标 路由对象
- from 当前导航正要离开的路由
- next 回调函数,一定要调用该方法来 resolve 这个钩子,可以在里面取消导航(next(false))或进行数据处理
(四) 注意事项
- beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。因而上面示例中api和axios都采用了手动导入,没有使用this.axios或者this.api的方式。
- 访问组件实例的方式是,通过传一个回调给 next来访问组件实例,也不能使用this。在上面示例中,获取数据成功后,使用的是vm.carInfo而不是this.carInfo。
- next(false)的作用是取消导航,这时,一切操作都停留在原页面,看起来就像什么也没发生一样。
Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转的更多相关文章
- iOS 多个异步网络请求全部返回后再执行具体逻辑的方法
对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...
- 每日技术总结:vue router传参方式,js获取设备高度
今天貌似没什么问题,23333…… 1.vue router 路由传参的方式 应用情景:从分类页(category.vue)进入商品列表页(list.vue),需要传递商品分类id(catId),商品 ...
- mssql sqlserver 使用sql脚本获取群组后,按时间排序(asc)第一条数据的方法分享
摘要: 下文讲述使用sql脚本,获取群组后记录的第一条数据业务场景说明: 学校教务处要求统计: 每次作业,最早提交的学生名单下文通过举例的方式,记录此次脚本编写方法,方便以后备查,如下所示: 实现思路 ...
- vue router 导航守卫生命周期
导航守卫 导航守卫主要用来通过跳转或取消的方式守卫导航.有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的.(记住参数或查询的改变并不会触发进入/离开的导航守卫.你可以通过观察$r ...
- Vue使用,异步获取日期时间后格式成"/Date(1333245600000+0800)/" 转换成正常格式
js从后台mvc中日期获取,结果格式成"/Date(1333245600000+0800)/"了,当然不能这样展显给用户了,要转换,方法如下: function data_stri ...
- AJAX获取数据成功后的返回数据如何声明成全局变量
var result=""; $.ajax({ type: "post", url: "../reportRule/main.do?method=se ...
- 使用Promise发送多个异步请求, 全部完成后再执行
const datas = idList .map(id => url+'/id') .map(url => fetch(url).then(res => res.json())); ...
- postman 获取登录成功后存在在header中cookies,并在下一个接口中使用。
1.首先登录成功 2.在tests中添加脚本 3.添加环境变量 4.配置环境变量和引用值 5.请求第二个接口成功
- vue+elementui搭建后台管理界面(8 同步/异步获取数据渲染table)
elementui已经封装好了 el-table 组件,只需要指定 data 数据源即可,因此通常在 vue 实例生命周期的 created 阶段,从数据库获取数据,再将返回的数据绑定到 data 如 ...
随机推荐
- Java学习笔记--Arrays
Arrays(数组工具类)常用方法 Arrays.toString(int[] a)方法 -------> 返回类型为String,可以用来产生数组的可打印表示,避免了用循环依次读取数组值进 ...
- Unity 游戏框架搭建 2019 (二十七) 弃用的代码警告解决
在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...
- spring官方为什么放弃spring social项目及替代方案
spring social 1.6之后官方不在维护该项目, spring boot 2.x之后也不在提供spring social的 Autoconfiguration. 原因: https://sp ...
- HTML5实现刷脸支付
最近刷脸支付很火,老板们当然要追赶时代潮流,于是就有了刷脸支付这个项目.前端实现关键的技术是摄像头录像,拍照和人脸比对,本文来探讨一下如何在html5环境中如何实现刷脸支付以及开发过程中遇到的问题. ...
- CentOS 7 yum安装 k8s 创建Pod一直处于ContainerCreating状态 问题解决
问题描述 使用CentOS7的 yum 包管理器安装了 Kubernetes 集群,使用 kubectl 创建服务成功后,执行 kubectl get pods,发现AGE虽然在不断增加,但状态始终不 ...
- python 集合(set)和字典(dictionary)的用法解析
Table of Contents generated with DocToc ditctaionary and set hash 介绍 集合-set 创建 操作和访问集合的元素 子集.超集.相对判断 ...
- day01,了解gcc
今天主要是学一下gcc 功能选项: 一. 1. gcc -E:表示预处理,把指令处理掉 2.gcc -o:改变目标文件名称 3. gcc -c: 表示只编译不链接(也就是不生成a.out) 4. g ...
- Daily Scrum 12/10/2015
Zhaoyang: Finished the implementation of query suggestion UI; Yandong: Changed the fusion algorithm ...
- 百度关键词搜索工具 v1.1|url采集工具 v1.1
功能介绍:关键词搜索工具 批量关键词自动搜索采集 自动去除垃圾二级泛解析域名 可设置是否保存域名或者url 持续更新中
- mac上安装htop
对于经常在mac上使用top命令的童鞋来说,htop会是一个更加好看和更加好用的命令,下面就是在mac上安装htop的步骤 1.首先去htop官网去下载,我下的是最新的2.2.0版本,网址是https ...