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

参考文章


相关文章
|
2月前
|
缓存 JavaScript 前端开发
高效打造跨平台桌面应用:Electron加载服务器端JS
【9月更文挑战第17天】Electron 是一个基于 Chromium 和 Node.js 的开源框架,允许使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用。加载服务器端 JS 可增强应用灵活性,实现代码复用、动态更新及实时通信。通过 HTTP 请求、WebSocket 或文件系统可实现加载,但需注意安全性、性能和兼容性问题。开发者应根据需求选择合适方法并谨慎实施。
111 3
|
1天前
|
数据采集 JavaScript 搜索推荐
服务器端渲染(SSR)(Nuxt+Next.js)
服务器端渲染(SSR)技术在服务器上生成页面HTML,提升首屏加载速度和SEO效果。Nuxt.js和Next.js分别是基于Vue.js和React.js的流行SSR框架。Nuxt.js提供自动化路由管理、页面级数据获取和布局系统,支持SSR和静态站点生成。Next.js支持SSR、静态生成和文件系统路由,通过`getServerSideProps`和`getStaticProps`实现数据获取。SSR的优点包括首屏加载快、SEO友好和适合复杂页面,但也会增加服务器压力、开发限制和调试难度。选择框架时,可根据项目需求和技术栈决定使用Nuxt.js或Next.js。
|
6天前
|
缓存 负载均衡 监控
性能优化:Node.js高效服务器开发技巧与最佳实践
【10月更文挑战第29天】在Node.js服务器开发中,性能优化至关重要。本文介绍了几种高效开发的最佳实践,包括使用缓存策略、采用异步编程、实施负载均衡和性能监控。通过示例代码展示了如何实现这些技术,帮助开发者构建更快、更稳定的Node.js应用。
20 2
|
24天前
|
JSON 前端开发 API
使用微信JS-SDK调用发票接口的完整开发指南
本文介绍了如何使用微信JS-SDK的`chooseInvoiceTitle`接口来调用微信的发票功能。通过微信发票接口,用户可以选择开具个人或单位发票,并获取相关发票信息,如抬头、税号、公司地址等。在文中,详细描述了JS-SDK的初始化、发票接口的调用方式,并提供了完整的代码示例。文章还介绍了如何处理返回的发票信息,帮助开发者快速集成微信发票功能。
66 2
|
1月前
|
JSON JavaScript 前端开发
使用 Node.js 和 Express 构建 RESTful API 服务器
【10月更文挑战第3天】使用 Node.js 和 Express 构建 RESTful API 服务器
|
1月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
23天前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
15 0
|
3月前
|
JavaScript NoSQL 中间件
《Node.js后端修炼手册》——揭秘服务器搭建与部署上线的生死时速,让你一战成名!
【8月更文挑战第27天】本文详细介绍如何从零开始利用Node.js构建后端服务器并部署至生产环境。首先,通过简易步骤搭建基础服务器,包括环境安装与配置。接着,引入Express框架优化路由与中间件管理,提升开发效率。随后,利用Mongoose实现MongoDB数据库连接,增强数据交互能力。为保证系统稳定性,文中还讲解了错误处理机制。最后,通过PM2等工具部署应用至生产环境,确保高效运行。本教程辅以示例代码,帮助读者快速掌握Node.js后端开发全流程。
90 2
|
3月前
|
JavaScript 前端开发 UED
服务器端渲染新浪潮:用Vue.js和Nuxt.js构建高性能Web应用
【8月更文挑战第30天】在现代Web开发中,提升应用性能和SEO友好性是前端开发者面临的挑战。服务器端渲染(SSR)能加快页面加载速度并改善搜索引擎优化。Vue.js结合Nuxt.js提供了一个高效框架来创建SSR应用。通过安装`create-nuxt-app`,可以轻松创建新的Nuxt.js项目,并利用其自动路由功能简化页面管理。Nuxt.js默认采用SSR模式,并支持通过`asyncData`方法预取数据,同时提供了静态站点生成和服务器端渲染的部署选项,显著提升用户体验。
77 0
|
JavaScript 前端开发 数据格式
javascript如何向服务器发送请求
javascript中向服务器发送http请求借助的是XMLHttpRequest对象,其他一些库如JQuery对http的请求应该是在这个上面的封装,创建XMLHTPRequest对象用下面的语句: function createXMLHttpRequest() { var xmlHttp; if (window.
1135 0