uniapp vue3 路由拦截
·
起因
接触小程序不多,遇到一个常见需求token失效或过期限制页面权限,并提示重新登录。
一种是通过vue-router 路由导航常用思路去实现
一种是通过uni.addInterceptor 拦截器实现
这里着重说第二种
uni.addInterceptor: 需要拦截的api名称,如:uni.addInterceptor('request', OBJECT) ,将拦截 uni.request()

实现思路就是 在main.js入口文件中 通过addInterceptor 添加拦截器拦截navigateTo redirectTo navigateBack switchTab 方法调用,在invoke(拦截前触发)然后判断是否登录,或是否失效等等。然后根据情况更改事件参数的url。
代码实现
import { createSSRApp } from 'vue';
import App from './App.vue';
import uviewPlus from 'uview-plus';
import { setupPinia } from './store';
export function createApp() {
const app = createSSRApp(App);
app.use(uviewPlus);
setupPinia(app);
function routerCallBack(args) {
let token = uni.getStorageSync('token');
// 根据自己需求写判断逻辑
if (args.url != '/pages/module-login/index' && !token) {
// 获取当前页面路由 将当前路由地址赋予args 这样他就不会跳转了
args.url = getCurrentPages()[0].route || args.url;
// 添加提示确认框
uni.showModal({
title: '登录已过期,请重新登录',
content: '是否前往登录?',
success: (res) => {
// 确认前往登录页面
if (res.confirm) {
uni.removeStorageSync('token');
uni.redirectTo({
url: '/pages/module-login/index',
});
}
},
});
}
}
// 添加各个路由跳转方法的拦截器
uni.addInterceptor('navigateTo', {
invoke: routerCallBack,
});
uni.addInterceptor('redirectTo', {
invoke: routerCallBack,
});
uni.addInterceptor('navigateBack', {
invoke: routerCallBack,
});
uni.addInterceptor('switchTab', {
invoke: routerCallBack,
});
return {
app,
};
}

注意:拦截uni.switchTab本身没有问题。但是在微信小程序端点击tabbar的底层逻辑并不是触发uni.switchTab。所以误认为拦截无效,此类场景的解决方案是在tabbar页面的页面生命周期onShow中处理。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)