uniapp小程序添加路由全局限制,增加路由白名单,登录后接口跳转参数正常传递
** 组件存放的位置 /utils/router.js**
import pagesJson from '@/pages.json'; // 引用配置文件的tabbar配置信息
const tabBarListData = pagesJson.tabBar.list
// 路由白名单
const whiteList = [
'/pages/index/index',
'/pages/mine/index',
'/pages/login/index'
]
// tabBar 页面路径
const tabBarList = tabBarListData.map(item => `/${item.pagePath}`)
// 保存原始路由方法
const originalNavigateTo = uni.navigateTo
const originalRedirectTo = uni.redirectTo
const originalSwitchTab = uni.switchTab
const originalNavigateBack = uni.navigateBack
// 路由拦截处理
function routerInterceptor(args) {
return new Promise((resolve) => {
let url = args.url
if (!url) return resolve(true)
// 1. 获取当前要跳转的路径(不带参数)
const toPath = url.split('?')[0]
// 2. 白名单直接放行
if (whiteList.includes(toPath)) {
return resolve(true)
}
// 3. 判断是否登录
const token = uni.getStorageSync('token')
if (!token) {
// 未登录 → 存起来跳转目标,登录后自动回去
uni.setStorageSync('redirectUrl', url)
// 跳转登录页
uni.redirectTo({
url: '/pages/login/login'
})
return resolve(false)
}
// 4. 已登录 → 放行
resolve(true)
})
}
// 开始全局拦截
uni.navigateTo = async function(options) {
const canGo = await routerInterceptor(options)
if (canGo) originalNavigateTo.call(this, options)
}
uni.redirectTo = async function(options) {
const canGo = await routerInterceptor(options)
if (canGo) originalRedirectTo.call(this, options)
}
// 拦截 tabBar
uni.switchTab = async function(options) {
const canGo = await routerInterceptor(options)
if (canGo) originalSwitchTab.call(this, options)
}
uni.navigateBack = async function(options) {
originalNavigateBack.call(this, options)
}
使用方法
在 App.vue 引入(必须)
<script>
// 引入全局路由拦截
import '@/utils/router.js'
export default {
onLaunch() {
console.log('小程序启动')
}
}
</script>