使用uniapp开发微信小程序-路由拦截

项目背景:所有页面都需要登录后才可以访问。

1、在项目中新建interceptors文件夹,新建文件route.ts

// route.ts
import { useUserStore } from '@/store'
// 登录页面的路由,例如:/pages/login/Index
const loginRoute = import.meta.env.VITE_SIGN_PATH

// 登录拦截器
const navigateToInterceptor = {
  // 这里的url是 '/' 开头的,如 '/pages/home/Index?name=Tom'
  invoke({ url }: { url: string }) {
  	const userStore = useUserStore()
    const hasLogin = userStore.token
    // 判断是否登录
    if (hasLogin || url.startsWith(loginRoute)) {
      return true
    }
    const redirect = `${loginRoute}?redirect=${encodeURIComponent(url)}`
    uni.navigateTo({ url: redirect })
    return false
  },
}

export const routeInterceptor = {
  install() {
    uni.addInterceptor('navigateTo', navigateToInterceptor)
    uni.addInterceptor('reLaunch', navigateToInterceptor)
    uni.addInterceptor('redirectTo', navigateToInterceptor)
  },
}

当然,也可以配合使用进行黑名单或者白名单的拦截处理。如果路由的处理逻辑比较复杂,建议配套使用@uni-helper/vite-plugin-uni-layouts插件,可以动态获取路由的元数据来进行逻辑处理。

2、在main.ts中使用拦截器

// main.ts
import { createSSRApp } from 'vue'
import App from './App.vue'
import store from './store'
import routeInterceptor from './interceptors'

export function createApp() {
  const app = createSSRApp(App)
  app.use(store)
  app.use(routeInterceptor)  
  return {
    app,
  }
}

需要注意的是,小程序首页(也就是pages数组的第一项)是不会进入拦截器的,例如程序的首页也需要判断是否已登录,如果没登录的话自动跳转到登录页面,这种情况需要首页单独处理逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值