更新记录
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 }
注意事项
- 导航队列:插件内置导航队列,防止并发导航导致状态混乱
- H5 后退:通过 popstate 监听 + history.forward 撤销实现后退拦截
- 小程序栈限制:自动检测页面栈是否达到上限(10层)
- 智能参数:URL 参数自动转换类型('123' → 123, 'true' → true)
- 业务无关:多条件守卫不预设任何业务状态,完全由使用者定义
License
MIT