Vue.js:Vue-Router动态路由从服务器接口获取路由数据

简介: Vue.js:Vue-Router动态路由从服务器接口获取路由数据

目录

文档

版本号

"vue": "2.6.10",
"vue-router": "3.6.5",

有几种方式实现动态路由

  1. 前端配置完整路由,通过接口返回的数据判断是否可显示,是否可访问
  2. 前端配置部分路由,由后端接口返回的数据生成新路由
  3. 抛开路由的思维,是否能直接通过url查询参数或者是动态路径参数解决问题

需求

部分页面通过服务器端接口返回的参数判断是否显示

用户可以添加新的分类,分类和路由的显示方式一致,拥有和路由相同的逻辑,故而采用通过服务端返回数据生成动态路由的方式解决

实现思路

1、添加路由

通过服务端接口返回的数据生成路由,是异步返回的数据,动态添加

可以通过Vue-Router提供的api,动态添加路由数据

addRoute(parentName: string, route: RouteConfig): () => void

文档说:

如果该路由规则有 name,并且已经存在一个与之相同的名字,则会覆盖它。

我想直接覆盖原有路由,这样路由位置就不变了

实际操作的时候发现:并不会覆盖,控制台会提示路由重复

2、添加时机

应该在路由跳转之前进行

router.beforeEach(async (to, from, next) => {
  // 需要有一个全局变量记录是否添加过
  if (!globalData.hasAddDynamicRoute) {
    await Store.dispatch('router/updateDynamicRoutes')
    globalData.hasAddDynamicRoute = true
  }
})

3、获取路由配置

该接口获取的路由数据是一维数组,和路由配置格式不一样

// 不要使用this.$router.options.routes
getRoutes(): RouteRecord[]

页面上显示的时候,需要从vuex获取路由信息,可以及时刷新页面数据

4、响应式路由

既然是动态路由,所以需要响应式,当路由数据发生变化时,可以及时的获取通知

通过vuex状态管理实现

// store/modules/router.js
export default {
  namespaced: true,
  state: {
    routes: [],
  },
  getters: {
    // 返回路由数据
    getRoutes(state) {
      return state.routes
    }
  },
  mutations: {
    setRoutes(state, routes) {
      state.routes = routes
    },
  },
  actions: {
    async updateDynamicRoutes({ commit }, userinfo) {
      // 添加动态路由
      await addDynamicRoutes()
      // 获取完整的路由信息
      const routes = router.getRoutes()
      commit('setRoutes', routes)
    },
  },
}

5、路由跳转

动态路由首次跳转的时候,动态路由还没有添加,需要转换处理

// 根据 to.name 来判断是否为动态路由
if (!to.name) {
    // 当前路由是动态的,确定是否存在
    if (router.getRoutes().findIndex((i) => i.path === to.path) !== -1) {
      next({ ...to, replace: true })
    } else {
      next('/')
    }
} else {
    next()
}

6、路由排序

添加的路由只能在最后,无法指定插入位置

通过meta元数据,添加排序字段order_value,可以在显示的时候实现排序

meta: {
    order_value: 1,
},

7、更新路由

如果数据变化,需要更新路由数据,再次添加同样会提示重复

[vue-router] Duplicate named routes definition

更新前需要先重置路由数据

// src/router/index.js
// 路由的创建
function createRouter() {
  return new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes,
  })
}
const router = createRouter()
// 重置路由
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}
export default router

参考文章


相关文章
|
8月前
|
网络协议 关系型数据库 应用服务中间件
如何迁移网站数据到新的服务器
迁移网站数据到新服务器是一个系统化的过程,需谨慎操作以避免数据丢失或服务中断。小编为您整理发布如何迁移网站数据到新的服务器,以下是详细步骤和注意事项。
|
8月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
1179 0
|
10月前
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
1526 58
|
11月前
|
缓存 人工智能 架构师
释放数据潜力:利用 MCP 资源让大模型读懂你的服务器
MCP(Model Control Protocol)资源系统是将服务器数据暴露给客户端的核心机制,支持文本和二进制两种类型资源。资源通过唯一URI标识,客户端可通过资源列表或模板发现资源,并使用`resources/read`接口读取内容。MCP还支持资源实时更新通知及订阅机制,确保动态数据的及时性。实现时需遵循最佳实践,如清晰命名、设置MIME类型和缓存策略,同时注重安全性,包括访问控制、路径清理和速率限制等。提供的示例代码展示了如何用JavaScript和Python实现资源支持。
1092 80
|
7月前
|
存储 安全 数据管理
服务器违规资源被删,数据定时备份OSS 云存储才是 “救命稻草”
在数字化时代,数据已成为企业与个人的核心资产。然而,服务器违规、硬件故障等问题频发,导致数据丢失、业务中断,甚至造成不可挽回的损失。为保障数据安全与业务连续性,定时备份至关重要。阿里云国际站OSS提供高效、可靠的云存储解决方案,支持自动定时备份,帮助用户轻松应对数据风险。本文详解OSS备份操作步骤与注意事项,助你为数据穿上“防护甲”,实现安全无忧存储。
|
9月前
|
弹性计算 安全
阿里云服务器镜像,快速迁移项目数据
有时候旧服务器快到期了,想把项目、数据、软件挪到新服务器上,如果全部重新搭建的话,那无疑是耗时又费力。有了镜像迁移,就方便了许多。
689 1
|
10月前
|
弹性计算 NoSQL 数据库
阿里云服务器如何备份数据?
阿里云服务器数据备份有多种方法,用户可按需选择。主要方式包括:1)快照备份,创建云盘的时间点拷贝,支持定期备份与数据恢复;2)数据库备份DBS,适用于多种环境的数据库备份,涵盖本地及多云场景;3)云备份Cloud Backup,提供统一灾备平台,支持ECS整机、数据库、文件系统等全方位备份,保障数据安全。
|
10月前
|
存储 数据库 Python
使用HTTP POST协议将本地压缩数据发送到服务器
总的来说,使用HTTP POST协议将本地压缩数据发送到服务器是一个涉及多个步骤的过程,包括创建压缩文件,设置HTTP客户端,发送POST请求,以及服务器端的处理。虽然这个过程可能看起来复杂,但一旦你理解了每个步骤,就会变得相对简单。
368 19
|
11月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
514 28