代码拉取完成,页面将自动刷新
一个类似于vue-router的路由器,用于uniapp(vue3),支持h5和微信小程序和app,其他小程序请自测
$ npm install uniapp-router-next
$ npm install unplugin-uni-router -D
// vite.config.ts
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import uniRouter from 'unplugin-uni-router/vite'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [uni(), uniRouter()]
})
// router.ts
import routes from 'uni-router-routes' //由unplugin-uni-router/vite根据pages.json生成
import { createRouter } from 'uniapp-router-next'
const router = createRouter({
routes: [
...routes,
// 通配符,一般用于匹配不到路径跳转404页面
{
path: '*',
redirect: () => {
// 可返回{ name: '404' },{ path: '/pages/404/404' }, '/pages/404/404'
return { name: '404' }
}
}
],
//@ts-ignore
platform: process.env.UNI_PLATFORM,
h5: {}
})
export default router
// main.ts
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
中组册// main.ts
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"
}
}
}
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>
// 跳转类型
navType = 'navigate' | 'redirect' | 'reLaunch' | 'switchTab' | 'navigateBack'
// navType = navigateBack时,可传回退页面层数
delta //默认值为1
import { useRoute } from 'uniapp-router-next'
const route = useRoute()
console.log(route)
// fullPath: '/pages/index/index'
// meta: {}
// query: {} 上一个页面的参数
// path: '/pages/index/home'
// name: ''
用法与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')
})
开启该功能 (unplugin-uni-router需更新到1.2.0版本以上)
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import uniRouter from 'unplugin-uni-router/vite'
// https://vitejs.dev/config/
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中标签绑定的数据
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。