uni-simple-router:使用vue-router管理uniapp路由

本文介绍如何使用uni-simple-router为uniapp项目添加类似vue-router的功能,包括安装、配置、路由跳转、APP退出处理及权限验证。

       笔记中的内容仅适用于HBulider构建的uniapp项目,通过其他方式构建的uniapp项目请参考uni-simple-router官网 uni-simple-router (hhyang.cn)

       uniapp用到了vue的很多api,但在路由管理的功能上相较于vue-router还是比较欠缺的,比如全局导航守卫。

        我们可以通uniapp的插件uni-simple-router来实现类似于vue-router的功能,但多端兼容时,一些用法还需要注意,我们会讲到。

一、安装

如果你的项目没有使用package,请先初始化:

$ npm init -y

安装依赖:

$ npm install uni-simple-router uni-read-pages
uni-read-pages的作用是:读取uniapp的pages.json,作为router的配置,把pages.json中的路由配置转换成vue-router配置的形式。

二、配置与初始化

1、根目录新建 vue.config.js 文件,写入以下内容:

//vue.config.js
const TransformPages = require('uni-read-pages')
const {webpack} = new TransformPages()
module.exports = {
    configureWebpack: {
        plugins: [
            new webpack.DefinePlugin({
                ROUTES: webpack.DefinePlugin.runtimeValue(() => {
                    const tfPages = new TransformPages({
                        includes: ['path', 'name', 'aliasPath']
                    });
                    return JSON.stringify(tfPages.routes)
                }, true )
            })
        ]
    }
}

⚠️ 其中要重点关注第 10 行:

// ...
    includes: ['path', 'name', 'aliasPath']
// ...

includes 中包含的是router会读取pages路由中的字段名,后续如果有用到meta等路由信息,可以在 includes 里增加 'meta',在pages路由中写对应的数据,router中就可以获取得到(后面再补充案例)

2、根目录新建并写入router.js,写入以下内容:

// router.js
import {RouterMount,createRouter} from 'uni-simple-router';

const router = createRouter({
    platform: process.env.VUE_APP_PLATFORM,  
    routes: [...ROUTES]
});
//全局路由前置守卫
router.beforeEach((to, from, next) => {
    next();
});
// 全局路由后置守卫
router.afterEach((to, from) => {
    console.log('跳转结束')
})

export {
    router,
    RouterMount
}

3、main.js导入router.js并挂载

// main.js

import Vue from 'vue'
import App from './App'
import {router,RouterMount} from './router.js'  //路径换成自己的
Vue.use(router)

App.mpType = 'app'
const app = new Vue({
    ...App
})

//v1.3.5起 H5端 你应该去除原有的app.$mount();使用路由自带的渲染方式
// #ifdef H5
    RouterMount(app,router,'#app')
// #endif

// #ifndef H5
    app.$mount(); //为了兼容小程序及app端必须这样写才有效果
// #endif
!!注意app的挂载方式,必须按照这里的写法实现!

4、重新编译运行

三、路由跳转

方法一:组件跳转

vue-router中可以通过 <router-link></router-link> 组件进行页面跳转,uni-simple-router也提供了类似的组件:只不过这个组件需要手动注册

// main.js
import Mylink from './node_modules/uni-simple-router/dist/link.vue'     
Vue.component('my-link',Mylink)
注册组件时注意,组件的名称不要和 pages.json 中的 easycom 属性规则冲突,否则会找easycom路径下的组件,从而找不到组件报错。
<!-- 通过path直接跳转 并指定跳转类型 -->
<my-link to="/tabbar-4" navType="pushTab">
  <button type="primary">使用path对象跳转</button>
</my-link>
组件的完整属性,可以在文档中找到:
Router 构建选项 | uni-simple-router (hhyang.cn)

方法二:编程式导航:

在vue示例中,通过 this.$Router 获取路由对象(R必须大写),编程式导航与vue-router很接近,但仍有需要注意的地方,具体可以参考文档.

⚠️ 必须注意的点:
在vue项目中,跳转路由时经常使用name进行跳转,相比于path,name更简洁、会被改变的几率也更小。

但是在uniapp中就要留意了,如果你要使用name进行跳转,那就无法携带query参数!同理,使用path跳转也不能使用params参数

// 以下是错误的写法,name不能搭配query使用,path也不能搭配params参数使用
this.$Router.push({ name: 'newsDetail', query: { id: '123' }})
this.$Router.push({ path: '/pages/news/detail', params: { id: '123' }})

// 以下是正确的写法:
this.$Router.push({ name: 'newsDetail', params: { id: '123' } })
this.$Router.push({ path: '/pages/news/detail',query: { id: '123' }})

总之:记住:path搭配query参数,name搭配params参数

四、APP退出应用

在app路由栈已到达最底层时,再次点击退出程序是非常常见的功能,我们可以这样实现:

// router.js文件

import {
    RouterMount,
    createRouter,
    runtimeQuit
} from './dist/uni-simple-router.js';
// runtimeQuit记得导入

const router = createRouter({
    platform: process.env.VUE_APP_PLATFORM,  
    routerErrorEach:({type,msg})=>{
        console.log({type,msg})
        // #ifdef APP-PLUS
            if(type===3){
                router.$lockStatus=false;
                runtimeQuit();
            }
        // #endif
    },
    routes: [...ROUTES]
});

routerErrorEach中,type的含义如下:

  • 0 表示 next(false)
  • 1 表示 next(unknownType)
  • 2 表示加锁状态,禁止跳转
  • 3 表示在获取页面栈的时候,页面栈不够level获

除了再次点击退出外,你还可以实现自己的逻辑,比如弹窗提示退出等:

const router = createRouter({
    platform: process.env.VUE_APP_PLATFORM,  
    routerErrorEach:({type,msg})=>{
        console.log({type,msg})
        // #ifdef APP-PLUS
            if(type===3){
                router.$lockStatus=false;
                uni.showModal({
                            title: '提示',
                            content: '您确定要退出应用吗?',
                            success: function (res) {
                                if (res.confirm) {
                                    plus.runtime.quit();
                                } 
                            }
                        });
            }
        // #endif
    },
    routes: [...ROUTES]
});

五、Route对象

和vue-router一样,uniapp在页面中也能获取当前的页面路由信息,不过首字母改成了大写字母:

onLoad() {
    console.log(this.$Route)
}

$Route 中包含了路由的基本信息以及,vue.config.js配置中includes配置的字段,和导航守卫中的to/from对象一致,利用includes配置项和导航守卫,可以实现权限校验的配置:

// router.js
router.beforeEach((to, from, next) => {
    if (to.meta && to.meta.power === "public") { // 公共页面,不需要登录
        
    } else { // 需要登录的页面
             let isLogin = checkLogin(); // 判断是否登录
        if (isLogin) {
            next();
        } else {
            next({
                name: "login"
            })
        }
    }
});
// pages.json
"pages": [
        {
            "path": "pages/login/login",
            "name": "login",
            "desc": "登录页",
            "meta": {
                "power": "public" // 不需要登录
            }
        },
          { // 需要登录
            "path": "pages/my/my",
            "name": "login",
            "desc": "我的"
        }
          //...
  ]

<think> 嗯,用户询问uni-simple-routeruniapp-router-next的区别。这是个技术问题,需要好好梳理。根据提供的参考资料,用户之前似乎在关注uniapp路由管理解决方案,特别是uni-simple-router的应用场景和路由守卫实现。用户现在想了解两个路由方案的差异,可能需要考虑兼容性、功能特性等关键点。 回顾之前的引用内容:引用[1]提到uni-simple-router适用于HBuilder构建的项目;引用[2][3]展示了它在路由守卫和权限控制的具体用法。但关于uniapp-router-next的信息较少,需要结合公开知识补充。 用户可能是uniapp开发者,正在选型路由方案。ta的深层需求可能是想知道哪个更适合当前项目,或者迁移成本如何。需要从几个维度对比: - 支持平台方面,uni-simple-router明确支持HBuilder构建的项目,而router-next可能更专注新架构 - API设计上,前者模仿vue-router,后者可能更贴近uniapp原生 - 拦截器实现差异,引用[3]显示uni-simple-router通过meta字段做路由守卫,这点很重要 - 维护状态,router-next作为官方新方案可能更新更及时 特别要注意用户提到的"page.json配置meta字段"这个细节,这说明ta的项目需要复杂权限控制。在回答时要强调router-next的拦截器写法差异,避免用户踩坑。 回答结构可以分核心区别、适用场景两部分,最后用表格总结。要提醒router-next在微信小程序等平台的限制,因为用户引用里没提跨平台需求,但这是uniapp的重点。结尾的提问可以引导用户说明具体场景,比如是否要升级现有项目。 </think> 以下是 **uni-simple-router** 与 **uniapp-router-next** 的核心区别分析,结合技术特性和应用场景: --- ### **1. 核心定位与技术路线** | **对比项** | **uni-simple-router** | **uniapp-router-next** | |---------------------|--------------------------------------------|---------------------------------------| | **技术基础** | 基于 Vue Router API 设计 | UniApp 官方推出的新一代路由方案 | | **兼容性** | 需配合 `vue.config.js` 扩展配置(如 `meta` 字段)[^3] | 深度集成 UniApp 原生路由体系 | | **路由守卫** | 支持完整的 `beforeEach` 等 Vue Router 风格守卫[^2][^3] | 使用 `uni.addInterceptor` 原生拦截器 | --- ### **2. 路由拦截实现差异** #### **uni-simple-router** 通过 **`meta` 字段声明权限**,在守卫中动态处理跳转: ```javascript // 配置 includes 扩展 meta 字段 [^3] // vue.config.js includes: ['path', 'name', 'aliasPath', 'meta'] // 路由守卫 router.beforeEach((to, from, next) => { if (to.meta.loginAuth && !uni.getStorageSync('token')) { uni.navigateTo({ url: `/pages/login/login?path=${to.path}` }) } else { next() } }) ``` #### **uniapp-router-next** 依赖 **原生拦截器**,需在入口文件注册: ```javascript // app.vue import { createRouter } from 'uniapp-router-next' const router = createRouter({ /* routes */ }) router.beforeEach((to, from, next) => { // 逻辑类似,但无需扩展 meta 配置 }) ``` --- ### **3. 适用场景对比** | **场景** | **uni-simple-router** | **uniapp-router-next** | |------------------------|--------------------------------------------|--------------------------------| | **老项目升级** | ✅ 兼容 HBuilder 传统项目[^1] | ❌ 需重构路由结构 | | **Vue Router 迁移** | ✅ 语法高度一致,学习成本低 | ️ 需适应新 API | | **跨平台支持** | ⚠️ 依赖构建工具配置 | ✅ 官方维护,多平台开箱即用 | | **TypeScript 支持** | ❌ 社区版类型支持较弱 | ✅ 官方提供完整 TS 类型定义 | --- ### **4. 总结建议** - **选择 uni-simple-router 如果**: 需快速接入类似 Vue Router 的守卫逻辑,项目基于 HBuilder 构建,且需要精细的路由元信息控制(如 `meta.auth`)[^3]。 - **选择 uniapp-router-next 如果**: 项目为全新开发,追求官方维护、跨平台兼容性及 TypeScript 支持,可接受较新的拦截器语法。 > 💡 **提示**:若项目需要复杂路由拦截(如动态权限),`uni-simple-router` 的 `meta` 扩展更灵活;若追求轻量级和官方生态,`uniapp-router-next` 更优。 --- **相关问题** 1. 如何在 uni-simple-router 中实现动态路由加载? 2. uniapp-router-next 在微信小程序端有哪些限制? 3. 两种方案在路由传参方式上有何差异? 4. 如何从 uni-simple-router 迁移到 uniapp-router-next?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ1447419295

谢谢老弟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值