更新记录

1.1.0(2026-06-28) 下载此版本

v1.1.0 (2025-06-28)

新增

  • 多条件链式守卫(MultiConditionGuard)
    • 支持按顺序检查多个用户状态
    • 遇到未通过条件立即拦截并引导用户
    • 支持自定义弹窗事件触发
    • 可为不同页面配置不同条件组合
  • 用户状态检查器(UserStateChecker)
    • 完全可扩展的状态检查系统
    • 不预设业务状态类型,由使用者自定义
    • 支持链式检查多个状态
  • 智能参数解析(smartParseValue)
    • URL 参数自动类型转换
    • 支持数字、布尔值、null、undefined 转换
  • 完整 API 文档
    • 模块导出列表
    • 工具函数导出
    • 常量导出
  • 多条件守卫详细文档(docs/MULTI_CONDITION_GUARD.md)

优化

  • 路由对象结构优化
    • 添加 source 字段标识导航来源
    • query 参数支持智能类型转换
    • 添加 params 字段(预留动态路由支持)
  • 配置读取器增强(PagesJsonReader)
    • 支持 tabBar 页面检测
    • 支持页面是否存在检查
    • 支持配置刷新
  • 路由匹配器增强(RouteMatcher)
    • 支持动态添加/移除路由
    • 支持路由存在检查
    • 预留动态路由匹配扩展点

特性

  • 自动读取 pages.json 配置
  • 零侵入 uni API 拦截
  • 完整的路由元信息支持
  • 导航队列防止并发
  • H5 平台 popstate 监听
  • App 平台物理返回键监听
  • 小程序页面栈限制检测
  • Promise 异步守卫支持

平台兼容性

uni-app(4.61)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - -

jz-route-guard

uni-app 路由守卫插件,提供类似 vue-router 的导航守卫功能,支持 App、小程序、H5 多端。

核心特性

  • 自动读取路由配置:直接从 pages.json 读取路由,无需额外配置路由文件
  • 完整的导航守卫:支持全局守卫、路由独享守卫、组件内守卫
  • 多条件链式守卫:支持链式检查多个用户状态,适用于多步骤认证流程
  • 多端兼容:App、小程序、H5 三端统一 API
  • 纯 JS 实现:基于 Class 语法,无框架依赖
  • 零侵入:通过拦截 uni 路由 API 实现守卫功能
  • 组合式 API:提供 useRoute、useRouter、useRouteGuard、useLeaveGuard
  • Promise 支持:守卫函数支持 async/await 和 Promise 返回
  • 智能参数解析:自动转换 URL 参数类型(数字、布尔值等)

安装

main.js 中安装插件:

import { createSSRApp } from 'vue'
import App from './App.vue'
import RouterGuard, { getRouterGuard } from '@/uni_modules/jz-route-guard'

export function createApp() {
  const app = createSSRApp(App)

  // 安装路由守卫插件
  app.use(RouterGuard)

  // 配置全局守卫
  const router = getRouterGuard()

  // 全局前置守卫
  router.beforeEach((to, from, next) => {
    console.log('即将跳转:', to.path)
    next()
  })

  // 全局后置守卫
  router.afterEach((to, from) => {
    console.log('跳转完成:', to.path)
  })

  return { app }
}

使用方式

1. 全局守卫

import { getRouterGuard } from '@/uni_modules/jz-route-guard'

const router = getRouterGuard()

// 前置守卫
router.beforeEach((to, from, next) => {
  const token = uni.getStorageSync('token')
  if (to.meta.requiresAuth && !token) {
    next({ path: '/pages/login/login' })
  } else {
    next()
  }
})

// 后置守卫
router.afterEach((to, from) => {
  console.log('导航完成:', to.path)
})

// 支持 async/await
router.beforeEach(async (to, from, next) => {
  const hasPermission = await checkUserPermission(to.path)
  if (!hasPermission) {
    next(false)
  } else {
    next()
  }
})

2. 路由独享守卫

pages.json 中配置:

{
  "pages": [
    {
      "path": "pages/user/user",
      "style": {
        "navigationBarTitleText": "用户中心",
        "meta": {
          "requiresAuth": true,
          "beforeEnter": "checkAuth"
        }
      }
    }
  ]
}

注册命名守卫:

router.registerNamedGuard('checkAuth', (to, from, next) => {
  const token = uni.getStorageSync('token')
  if (!token) {
    next({ path: '/pages/login/login' })
  } else {
    next()
  }
})

3. 组件内守卫

使用组合式 API:

<script setup>
import { ref } from 'vue'
import { useLeaveGuard } from '@/uni_modules/jz-route-guard'

const formDirty = ref(false)

// 离开守卫
useLeaveGuard((to, from, next) => {
  if (formDirty.value) {
    uni.showModal({
      title: '提示',
      content: '表单未保存,确认离开?',
      success: (res) => {
        next(res.confirm)
      }
    })
  } else {
    next()
  }
})
</script>

使用 Options API(通过混入):

<script>
import { RouteGuardMixin } from '@/uni_modules/jz-route-guard'

export default {
  mixins: [RouteGuardMixin],
  beforeRouteLeave(to, from, next) {
    if (this.formDirty) {
      uni.showModal({
        title: '提示',
        content: '表单未保存,确认离开?',
        success: (res) => {
          next(res.confirm)
        }
      })
    } else {
      next()
    }
  }
}
</script>

4. 组合式 API

<script setup>
import { useRoute, useRouter } from '@/uni_modules/jz-route-guard'

const route = useRoute()
const router = useRouter()

// 获取当前路由信息
console.log('当前路径:', route.value.path)
console.log('查询参数:', route.value.query)
console.log('路由元信息:', route.value.meta)

// 导航方法
const goUser = () => router.push('/pages/user/user', { id: 123 })
const goBack = () => router.back()
const replacePage = () => router.replace('/pages/home/home')
</script>

5. 多条件链式守卫

适用于需要多步骤认证的功能页面(如 VIP专区、金融功能等):

import { getMultiConditionGuard, getUserStateChecker } from '@/uni_modules/jz-route-guard'

// 1. 定义状态类型(业务层自定义)
const UserStateType = {
  REAL_NAME: 'realName',
  PERSONAL_AUTH: 'personalAuth',
  PROFILE: 'profile'
}

// 2. 注册状态检查器
const checker = getUserStateChecker()
checker.registerChecker(UserStateType.REAL_NAME, {
  check: () => uni.getStorageSync('realNameVerified') === true,
  redirectPath: '/pages/auth/real-name-auth',
  title: '实名认证',
  message: '该功能需要完成实名认证,是否前往认证?'
})

checker.registerChecker(UserStateType.PERSONAL_AUTH, {
  check: () => uni.getStorageSync('personalAuthVerified') === true,
  redirectPath: '/pages/auth/personal-auth',
  title: '本人认证',
  message: '该功能需要完成本人认证,是否前往认证?'
})

// 3. 配置页面条件
const multiGuard = getMultiConditionGuard()
multiGuard.setPageConditions('/pages/vip/vip-content', [
  UserStateType.REAL_NAME,
  UserStateType.PERSONAL_AUTH
])

// 4. 在全局守卫中使用
router.beforeEach(multiGuard.createGuard())

详细使用说明请参考 多条件守卫文档

API 文档

全局方法

方法 说明 参数
install(app, options) Vue 插件安装 app, options
getRouterGuard() 获取全局实例 -
getMultiConditionGuard() 获取多条件守卫实例 -
getUserStateChecker() 获取用户状态检查器 -
getPagesJsonReader() 获取配置读取器 -

RouterGuard 实例方法

方法 说明 参数
beforeEach(guard) 注册全局前置守卫 (to, from, next) => void
afterEach(guard) 注册全局后置守卫 (to, from) => void
registerNamedGuard(name, guard) 注册命名守卫 name, guard
getCurrentRoute() 获取当前路由 -
getConfig() 获取配置 -
getMatcher() 获取路由匹配器 -
getReader() 获取配置读取器 -
uninstall() 卸载插件 -

RouteMatcher 方法

方法 说明
init(pages) 初始化路由表
match(path) 匹配路由
getRoutes() 获取所有路由
addRoute(record) 添加路由
removeRoute(path) 移除路由
hasRoute(path) 检查路由是否存在
getFirstRoute() 获取首页路由

PagesJsonReader 方法

方法 说明
init() 初始化,读取 pages.json
getPages() 获取所有页面配置
getPageMeta(path) 获取页面 meta 信息
requiresAuth(path) 检查页面是否需要登录
getAuthRequiredPages() 获取所有需要登录的页面
getTabBarPages() 获取 tabBar 页面列表
isTabBarPage(path) 检查是否为 tabBar 页面
getAllPagePaths() 获取所有页面路径
refresh() 刷新配置

MultiConditionGuard 方法

方法 说明
setPageConditions(path, conditions, options) 配置页面条件
createGuard(options) 创建全局守卫函数
createGuardFor(conditions, options) 创建指定条件守卫
checkPageAccess(path) 检查页面访问权限
getPageConditions(path) 获取页面条件
clearPageConditions(path) 清除页面条件
getStateChecker() 获取状态检查器

UserStateChecker 方法

方法 说明
registerChecker(type, config) 注册状态检查器
checkState(type) 检查单个状态
checkStates(types) 检查多个状态(链式)
getConfig(type) 获取状态配置
getRegisteredTypes() 获取已注册类型
hasChecker(type) 检查类型是否已注册
clearAllCheckers() 清除所有检查器

组合式 API

API 说明
useRouteGuard() 获取路由守卫实例
useRoute() 获取当前路由信息(响应式)
useRouter() 获取导航方法
useLeaveGuard(guard) 注册组件内离开守卫

useRouter 导航方法

方法 说明 参数
push(url, query) 导航到指定页面 url, query
replace(url, query) 替换当前页面 url, query
back(delta) 返回上一页 delta
reLaunch(url, query) 重启应用 url, query
switchTab(url) 切换 tabBar url
getCurrentRoute() 获取当前路由 -

工具函数

函数 说明
normalizePath(path) 标准化路径
parseUrl(url) 解析 URL(返回 path, query)
buildUrl(path, query) 构建 URL
getCurrentPath() 获取当前页面路径
getPreviousPath() 获取上一页路径
smartParseValue(value) 智能类型转换
deepClone(obj) 深拷贝
merge(target, source) 合并对象
getPlatform() 获取当前平台
isH5() 是否为 H5 平台
isApp() 是否为 App 平台
isMiniProgram() 是否为小程序平台
isApiAvailable(name) 检查 API 是否可用

路由对象

{
  type: 'navigateTo',           // 导航类型
  path: '/pages/user/user',     // 页面路径
  fullPath: '/pages/user/user?id=123', // 完整路径(含参数)
  params: {},                   // 路由参数(暂不支持)
  query: { id: 123 },           // 查询参数(智能类型转换)
  meta: { requiresAuth: true }, // 路由元信息
  matched: RouteRecord,         // 匹配的路由记录
  source: 'api'                 // 导航来源:api/popstate/gesture/user
}

导航来源类型

来源 说明
api uni API 调用触发
popstate H5 浏览器后退按钮
gesture App/小程序手势返回
user 用户操作触发

配置选项

{
  enable: true,           // 是否启用守卫
  enableGlobal: true,     // 是否启用全局守卫
  enableRouteGuard: true, // 是否启用路由独享守卫
  enableComponent: true   // 是否启用组件内守卫
}

平台支持

平台 支持情况 特殊功能
H5 浏览器后退拦截、popstate 监听
App-Android 物理返回键拦截
App-iOS 手势返回拦截
微信小程序 页面栈限制检测
支付宝小程序 页面栈限制检测
字节跳动小程序 页面栈限制检测
百度小程序 页面栈限制检测
QQ 小程序 页面栈限制检测

模块导出

// 组合式 API
export { useRouteGuard, useRoute, useRouter, useLeaveGuard }

// 混入
export { RouteGuardMixin }

// 核心模块
export { RouterGuard, RouteRecord, NavigationGuard, RouteMatcher }
export { PagesJsonReader, getPagesJsonReader }
export { MultiConditionGuard, getMultiConditionGuard }
export { UserStateChecker, getUserStateChecker }

// 工具函数
export { normalizePath, parseUrl, buildUrl, getCurrentPath, getPreviousPath }
export { smartParseValue, deepClone, merge }
export { getPlatform, isH5, isApp, isMiniProgram, isApiAvailable, getPlatformInfo }

// 常量
export { ROUTE_METHODS, GUARD_TYPES, NAVIGATION_SOURCE, PLATFORM_TYPES }
export { DEFAULT_CONFIG, ROUTER_GUARD_KEY, ROUTE_META_KEY }

// 全局方法
export { install, getRouterGuard }
export default { install, RouterGuard, version }

注意事项

  1. 导航队列:插件内置导航队列,防止并发导航导致状态混乱
  2. H5 后退:通过 popstate 监听 + history.forward 撤销实现后退拦截
  3. 小程序栈限制:自动检测页面栈是否达到上限(10层)
  4. 智能参数:URL 参数自动转换类型('123' → 123, 'true' → true)
  5. 业务无关:多条件守卫不预设任何业务状态,完全由使用者定义

License

MIT

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。