当前位置:   article > 正文

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

uni-read-pages

       笔记中的内容仅适用于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 文件,写入以下内容:

  1. //vue.config.js
  2. const TransformPages = require('uni-read-pages')
  3. const {webpack} = new TransformPages()
  4. module.exports = {
  5. configureWebpack: {
  6. plugins: [
  7. new webpack.DefinePlugin({
  8. ROUTES: webpack.DefinePlugin.runtimeValue(() => {
  9. const tfPages = new TransformPages({
  10. includes: ['path', 'name', 'aliasPath']
  11. });
  12. return JSON.stringify(tfPages.routes)
  13. }, true )
  14. })
  15. ]
  16. }
  17. }

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

  1. // ...
  2. includes: ['path', 'name', 'aliasPath']
  3. // ...

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

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

  1. // router.js
  2. import {RouterMount,createRouter} from 'uni-simple-router';
  3. const router = createRouter({
  4. platform: process.env.VUE_APP_PLATFORM,
  5. routes: [...ROUTES]
  6. });
  7. //全局路由前置守卫
  8. router.beforeEach((to, from, next) => {
  9. next();
  10. });
  11. // 全局路由后置守卫
  12. router.afterEach((to, from) => {
  13. console.log('跳转结束')
  14. })
  15. export {
  16. router,
  17. RouterMount
  18. }

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

  1. // main.js
  2. import Vue from 'vue'
  3. import App from './App'
  4. import {router,RouterMount} from './router.js' //路径换成自己的
  5. Vue.use(router)
  6. App.mpType = 'app'
  7. const app = new Vue({
  8. ...App
  9. })
  10. //v1.3.5起 H5端 你应该去除原有的app.$mount();使用路由自带的渲染方式
  11. // #ifdef H5
  12. RouterMount(app,router,'#app')
  13. // #endif
  14. // #ifndef H5
  15. app.$mount(); //为了兼容小程序及app端必须这样写才有效果
  16. // #endif
!!注意app的挂载方式,必须按照这里的写法实现!

4、重新编译运行

三、路由跳转

方法一:组件跳转

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

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

方法二:编程式导航:

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

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

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

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

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

四、APP退出应用

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

  1. // router.js文件
  2. import {
  3. RouterMount,
  4. createRouter,
  5. runtimeQuit
  6. } from './dist/uni-simple-router.js';
  7. // runtimeQuit记得导入
  8. const router = createRouter({
  9. platform: process.env.VUE_APP_PLATFORM,
  10. routerErrorEach:({type,msg})=>{
  11. console.log({type,msg})
  12. // #ifdef APP-PLUS
  13. if(type===3){
  14. router.$lockStatus=false;
  15. runtimeQuit();
  16. }
  17. // #endif
  18. },
  19. routes: [...ROUTES]
  20. });

routerErrorEach中,type的含义如下:

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

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

  1. const router = createRouter({
  2. platform: process.env.VUE_APP_PLATFORM,
  3. routerErrorEach:({type,msg})=>{
  4. console.log({type,msg})
  5. // #ifdef APP-PLUS
  6. if(type===3){
  7. router.$lockStatus=false;
  8. uni.showModal({
  9. title: '提示',
  10. content: '您确定要退出应用吗?',
  11. success: function (res) {
  12. if (res.confirm) {
  13. plus.runtime.quit();
  14. }
  15. }
  16. });
  17. }
  18. // #endif
  19. },
  20. routes: [...ROUTES]
  21. });

五、Route对象

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

  1. onLoad() {
  2. console.log(this.$Route)
  3. }

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

  1. // router.js
  2. router.beforeEach((to, from, next) => {
  3. if (to.meta && to.meta.power === "public") { // 公共页面,不需要登录
  4. } else { // 需要登录的页面
  5. let isLogin = checkLogin(); // 判断是否登录
  6. if (isLogin) {
  7. next();
  8. } else {
  9. next({
  10. name: "login"
  11. })
  12. }
  13. }
  14. });
  1. // pages.json
  2. "pages": [
  3. {
  4. "path": "pages/login/login",
  5. "name": "login",
  6. "desc": "登录页",
  7. "meta": {
  8. "power": "public" // 不需要登录
  9. }
  10. },
  11. { // 需要登录
  12. "path": "pages/my/my",
  13. "name": "login",
  14. "desc": "我的"
  15. }
  16. //...
  17. ]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/392296
推荐阅读
相关标签
  

闽ICP备14008679号