uni-mini-router
uni-mini-router是一个基于vue3和uni-app框架的轻量级路由库,它提供了类似Vue Router的API和功能,可以帮助开发者实现在uni-app中进行路由跳转、传参、拦截等常用操作。
1. 安装依赖
yarn add uni-mini-router -D
yarn add uni-read-pages-vite // 生成路由表
uni-read-pages-vite依赖vite,在编译时将读取pages.json生成的路由表注入全局变量
2. 创建一个新页面 mine
3. 在 src/pages.json 中添加页面配置
- 参考:uniapp.dcloud.io/collocation…
- 在pages.json中为页面路由指定
name字段后,即可以使用name跳转 - 修改完之后需要重启
{
"pages": [
{
"name": "home",
"path": "pages/index/index",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "首页"
}
},
{
"name": "mine",
"path": "pages/mine/index",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "我的"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8"
}
}
4. 配置vite.config.ts
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
import TransformPages from 'uni-read-pages-vite'
export default defineConfig({
plugins: [uni()],
define: {
ROUTES: new TransformPages().routes, // 注入路由表
}
});
5. 声明文件type.d.ts
在项目src目录下创建
type.d.ts文件。
declare const ROUTES: []
6. 配置router/index.ts
在src目录下新建 router/index.ts 目录文件
- 我这写的与文档不相同主要是为了方便我的路由守卫
import {createRouter} from 'uni-mini-router'
import type {App} from 'vue'
const router = createRouter({
routes: [...ROUTES] // 路由表信息
})
export function setupRouter(app: App<Element>) {
app.use(router)
}
export {router}
7. 给TabBar 添加导航跳转
- 通过在page.json 中设置的name 就可以进行跳转指定页面
const tabBarList = [
{
index: 1,
title: "首页",
icon: "home",
onClick: () => router.push({name: "home"})
},
{
index: 2,
title: "扫一扫",
icon: "scan",
float: true,
onClick: () => console.log("打开相机")
},
{
index: 3,
title: "我的",
icon: "person",
onClick: () => router.push({name: "mine"})
}
]
- 携带参数
// 命名的路由,并加上参数,让路由建立 url
router.push({ name: 'mine', params: { username: 'eduardo' } })
// 带查询参数,结果是 /user?username=eduardo
router.push({ path: '/pages/mine/index', query: { username: 'eduardo' } })
8. 接收参数
- 到需要跳转的页面
<script setup lang="ts">
import {onLoad} from "@dcloudio/uni-app";
onLoad((option) => {
console.log(option)
})
</script>
9. 导航守卫
-
在 /router 目录下创建 guard.ts 文件
-
全局前置守卫
to: 即将要进入的目标from: 当前导航正要离开的路由next: 用于reslovebeforeEach钩子,需要确保next在导航守卫中都被严格调用一次-next(): 执行默认路由跳转逻辑next(false): 终止跳转逻辑next({ path: '/' }): 跳转到不同的页面next({ path: '/', navType: 'replaceAll' }): 改变当前跳转类型并跳转到不同的页面,可以通过navType指定新的跳转类型。(实例为中断当前导航,改用replaceAll方法跳转到新的页面)
export function createBeforeEachGuard(router: Router) {
router.beforeEach((to, from, next) => {
next()
})
}
- 全局后置钩子
- 分析、更改页面标题、声明页面等辅助功能以及许多其他事情都很有用
export function createAfterEachGuard(router: Router) {
router.afterEach((to, from) => {
})
}
- 注册守卫
export function setupRouter(app: App<Element>) {
app.use(router)
createBeforeEachGuard(router)
createAfterEachGuard(router)
}