更新记录
2.0.1(2023-03-20) 下载此版本
- 修复小程序端路由栈溢出问题(#2)
2.0.0.beta(2023-03-13) 下载此版本
- 添加支持 Vue 3.x,同时兼容 Vue 2.x
- 支持 TypeScript
- 支持拦截 uni 原生路由跳转方法
- beforeEach next 函数追加 boolean 参数
- 路由跳转参数支持传递对象
1.0.2(2021-06-06) 下载此版本
修复未定义 beforeEach 时路由无法跳转问题
查看更多平台兼容性
Vue2 | Vue3 |
---|---|
√ | √ |
App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
---|---|---|---|---|---|---|
app-vue app-nvue | √ | √ | √ | √ | √ | √ |
钉钉小程序 | 快手小程序 | 飞书小程序 | 京东小程序 |
---|---|---|---|
√ | √ | √ | √ |
H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-router-interceptor v2.0.1.beta
a simple router interceptor for uni-app
uni-router-interceptor 是一个基于uni-app框架的纯路由拦截插件
下载插件后直接导入即可,用法基本和 Vue-Router 一样
由于自己的项目需要一个类似 vue-router 的路由拦截功能,本人考察了 uni 插件市场的大部分这一类的插件,发现很多插件都配置特别繁琐,
并且编译后还有路由层级限制,最多只能 navigateTo 十层,这就让自己很难受了,于是自己也有了造一个轮子的想法。
解决这个问题我的思路是自己维护一套路由历史记录,路由回退时从历史记录中取记录
本插件的本质还是 uni 的自带路由,只是对 uni 的自带路由进行了包装,使用
uni.addInterceptor
对uni的路由方法进行拦截
安装
建议直接使用 npm 进行安装使用
使用 NPM 安装
npm install uni-router-interceptor
使用
import Router from 'uni-router-interceptor'
export default new Router({
homePage: '/' // 首页的page路由
})
直接下载使用
// 以下路径需根据项目实际情况填写
import Router from './dist/index.js'
export default new Router({
homePage: '' // 首页的page路由
})
在 main.js
中导入 router
// Vue 2.x
Vue.use(router)
// Vue 3.x
import App from './App.vue'
const app = createApp(App)
app.use(router)
之后就可以抛弃 uni.navigateTo()
这样的uni原生跳转方法,改成 this.$Router.navigateTo()
进行愉快的使用啦
并且 uni 原生跳转参数基本全部都支持。其中 this.$Router
中的路由方法完全和 uni 自带的一样
Changelog
- 修复小程序端路由栈溢出问题(#2)
API
基本使用
// 保留当前页面,跳转到应用内的某个页面
this.$Router.navigateTo({
url: '/pages/index/index',
query: {} // 路由传参
})
// 关闭当前页面,跳转到应用内的某个页面
this.$Router.redirectTo({
url: '/pages/index/index',
query: {} // 路由传参
})
// 关闭所有页面,打开到应用内的某个页面。
this.$Router.reLaunch({
url: '/pages/index/index',
query: {} // 路由传参
})
// 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
this.$Router.switchTab({
url: '/pages/index/index'
})
// 关闭当前页面,返回上一页面或多级页面
this.$Router.navigateBack()
// 预加载页面
this.$Router.preloadPage({
url: '/pages/index/index'
})
路由传参
路由传递的 query 参数获取可以参照uni 自带的参数获取方法
onLoad(options) {
// options 路由参数
}
路由参数中支持传递嵌套的 Object
, 如果参数是一个嵌套的对象需要使用 decodeURIComponent
转义后再使用 JSON.parse
进行序列化
// 传递参数
this.$Router.navigateTo({
url: '/******',
query: {
id: 15,
data: { name: 'jack' }
}
})
// 接收参数
onLoad(options) {
const data = JSON.parse(decodeURIComponent(options.data))
console.log(data) // { name: 'jack' }
}
Tips: 如果不需要传递参数,可以直接使用 this.$Router.navigateTo('/pages/index/index')
路由拦截
// 路由前置拦截器
router.beforeEach((to, from, next) => {
// TODO something
// 必须执行 next() 否则路由不会继续向下执行
// next 函数需要传递一个 boolean 值参数
// 不传参时默认为 true,路由会继续执行跳转。
// 参数为 false 时禁止跳转,并在 error 回调中抛出异常
// next(true)
next()
// 禁止跳转
// next(false)
})
// 路由后置拦截器
router.afterEach((to, from) => {
// TODO something
})
// 捕获路由错误信息
router.error(() => {
// TODO something
})
- to 目标路由跳转信息
- from 当前路由对象
- next 路由放行,执行跳转操作
this.$Router.pages // 当前页面栈的实例数组
this.$Router.history // 路由历史记录信息数组