uniapp-router-next
一个类似于vue-router的路由器,用于uniapp(vue3),支持h5和微信小程序和app,其他小程序请自测
安装
$ npm install uniapp-router-next
$ npm install unplugin-uni-router -D
使用
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import uniRouter from 'unplugin-uni-router/vite'
export default defineConfig({
plugins: [uni(), uniRouter()]
})
import routes from 'uni-router-routes'
import { createRouter } from 'uniapp-router-next'
const router = createRouter({
routes: [
...routes,
{
path: '*',
redirect: () => {
return { name: '404' }
}
}
],
platform: process.env.UNI_PLATFORM,
h5: {}
})
export default router
import { createSSRApp } from 'vue'
import router from './router'
import App from './App.vue'
export function createApp() {
const app = createSSRApp(App)
app.use(router)
return {
app
}
}
全局组册组件
有以下两种组册方式,选择一种即可,推荐easycom
这种方式
- 在
main.ts
或main.js
中组册
import { createSSRApp } from 'vue'
import RouterNavigate from 'uniapp-router-next/components/router-navigate/router-navigate.vue'
import router from './router'
import App from './App.vue'
export function createApp() {
const app = createSSRApp(App)
app.component('router-navigate', RouterNavigate)
app.use(router)
return {
app
}
}
- 基于
uniapp
的easycom
,在pages.json
中添加以下代码
{
"easycom": {
"custom": {
"router-navigate": "uniapp-router-next/components/router-navigate/router-navigate.vue"
}
}
}
api跳转
import { useRouter } from 'uniapp-router-next'
const router = useRouter()
router.navigateTo({
path: '/pages/index/index',
query: {
name: 'name'
}
})
router.navigateTo...
router.reLaunch...
router.redirectTo...
router.switchTab..
router.navigateBack...
组件跳转
<template>
<router-navigate to="/pages/index/index">go</router-navigate>
</template>
组件props
navType = 'navigate' | 'redirect' | 'reLaunch' | 'switchTab' | 'navigateBack'
delta
路由信息
import { useRoute } from 'uniapp-router-next'
const route = useRoute()
console.log(route)
路由守卫
用法与vue-router类似
目前只有beforeEach和afterEach,beforeEach支持拦截,在页面跳转前出发,afterEach在页面的onShow生命周期触发
beforeEach 在返回 false,抛出错误,返回 Promise.reject,调用 next(false)时会停止,返回其它或者调用 next()则执行下一个守卫,next({path: 'xxx'})后终止当前并执行跳转
router.beforeEach(async (to, form, next) => {
console.log(to, form, 'beforeEach')
})
router.afterEach((to, form) => {
console.log(to, form, 'afterEach')
})
实验性功能
App.vue 模板替换(nvue不支持)
-
开启该功能 (unplugin-uni-router需更新到1.2.0版本以上)
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import uniRouter from 'unplugin-uni-router/vite'
export default defineConfig({
plugins: [uni(),uniRouter({
replaceAppToPages: true
})]
})
-
在App.vue中写入公共模板
<template>
<view>header</view>
<outlet />
<view>footer</view>
</template>
<script setup lang="ts">
import { onLaunch, onShow, onHide } from "@dcloudio/uni-app";
onLaunch(() => {
console.log("App Launch");
});
onShow(() => {
console.log("App Show");
});
onHide(() => {
console.log("App Hide");
});
</script>
<style></style>
-
最终会替换所有在pages.json中注册的页面
// page.vue
<template>
<view>page</view>
</template>
-
替换结果
// page.vue
<template>
<view>header</view>
<view>page</view>
<view>footer</view>
</template>
-
取消某一页面的替换
在pages.json中添加skipReplace
{
"pages": [
{
"path": "pages/index/index",
"name": "index",
"aliasPath": "/",
"meta": {
},
"skipReplace": true
}]
}
注意
App.vue 模板替换会影响页面的布局,请谨慎使用,而且替换只能替换template中的静态内容,无法替换template中标签绑定的数据