uni-app路由拦截方法使用

2,378 阅读2分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

前言

写过vue项目基本都有了解路由拦截,为了防止用户未登录情况,访问一些页面造成错误。一般我们都需要在这一层做个判断,用户登录后才能看到这个页面,如果未登录,就跳转登录页。在uni-app也提供了一些api方便我们做路由拦截。

如何进行拦截

  uni.addInterceptor(STRING, OBJECT)

这是官方文档 uniapp.dcloud.net.cn/api/interce…

image.png

通过文档,我们知道这个方法传入要拦截的api名称即可。

因为我们要实现的是路由的拦截,因此我们这里应该传入路由的api名称,uni-app路由相关的api分别有 "navigateTo", "redirectTo", "reLaunch", "switchTab" 所以我们项目初始化的时候对这些api进行拦截初始化。

拦截器实现

新建一个js文件封装拦截器,命名为permission.js。

//白名单 不需要验证token
const whiteList = [
	"/pages/index/index",
	"/pages/index/login",
]
//登录页
const loginPage = "/pages/index/login"
export default function initPermission() {
	/**
	 * 页面跳转拦截器
	 */
	const list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
	list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
		uni.addInterceptor(item, {
			invoke(e) { // 调用前拦截
				console.log('拦截', e)
				//获取用户的token
				const token = uni.getStorageSync('token'),
					//获取要跳转的页面路径(url去掉"?"和"?"后的参数)
				url = e.url.split('?')[0];
				let notNeed = whiteList.includes(url)
				// 如果在whiteList里面就不需要登录
				if (notNeed) {
					return e
				} else {
					//需要登录
					if (!token) {
						uni.showToast({
							title: '请先登录',
							icon: 'none'
						})
						uni.navigateTo({
							url: loginPage
						})
						return false
					} else {
						return e
					}
				}
			},
			fail(err) { // 失败回调拦截 
				console.log(err);
			}
		})
	})



}

定义好白名单,就是不需要拦截的页面,定义好需要拦截的api,对这个api作一个便利,实现拦截,核心方法是invoke,这里要做拦截的处理。

这里首先应该判断当前访问路径是否在白名单,如果在白名单,就不拦截,return 回去。 如果不在白名单,那么判断token是否存在,如果存在则放行,否则跳转登录页。

我们这里打印下路由跳转的时候是否触发了拦截方法,这是跳转页面触发的日志,可以看到已经生效。 注意拦截器代码要在App.vue进行初始化

image.png

image.png

当我们点击一个不在白名单的页面时候

image.png 可以看到拦截器方法触发了2次,因为"/pagesDetail/index/chipHouse"被拦截了,跳转登录界面。

总结

路由拦截在uni-app开发中应该是经常要使用到的,这可以帮助我们省略很多重复代码,不用每次跳转页面写登录判断,或者一些无权限页面被其他人访问到。