vue实现动态路由添加(简单无废话版本)

这篇具有很好参考价值的文章主要介绍了vue实现动态路由添加(简单无废话版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近练习vue的项目,有关于后台管理系统的动态添加路由部分,根据思路实现了基本的功能,在这里记录一下,等后面学习后在进行优化。

这里只是记录我个人最后实现的思路,本人由于是初学者,可能思路和代码有不正确地方,还求多见谅。也请能不吝赐教,一同进步。

一 . 封装一个处理生产路由的函数

我们可以封装一个函数,这个函数专门用来帮助我们生产最后添加到路由中的路由对象

//map-menu.js 
//动态添加路由
const modules = import.meta.glob('../views/*/*.vue')    //vite中获取组件文件的方法
export function mapMenu(navList) {		//navList 传入后台接口返回的路由列表
  //最终动态添加路由返回数组
  const routerList = []
  for (const key of navList) {
    routerList.push({
      path: `/${key.nUrl.split('/')[2]}`,
      name: `${key.nUrl.split('/')[2].toUpperCase()}`,
      component: modules[`..${key.nUrl}`]
    })
  }
  return routerList
}

注意:这里需要大家自己根据自己需要的情况进行处理,因为后端接口传递过来的数据不同,所以你需要根据情况将path,name,component这三个获取出来并最终转换成你需要的。

二. vuex中进行调用

我们封装好了一个函数,接下来我们就需要调用来帮助我们动态生产路由,但是有一个问题来了,我们需要何时来进行动态生成路由。
这里我个人理解是:1.在用户进行登录后进行动态生产路由,将用户的菜单生成出来,并保存起来。 2. 就是在页面刷新时候我们也需要动态生成路由,因为刷新页面路由会刷新,不再次进行动态生成就是丢失,这里我们可以和对vuex初始化一起进行。

// vuex中的user.js模块
//动态添加路由
import { mapMenu } from '@/util/map-menu.js'   //前面封装的函数
  state: {
    userNav: []
  },
  mutations: {
    changeUserNav(state, userNav) {
      state.userNav = userNav
      //动态添加路由
      mapMenu(userNav).forEach((route) => {
        router.addRoute(route)		//动态添加路由
      })
    }
  },
  actions: {
    async requestUserNav({ commit }) {
      const navList = await getRolesNavRequest()
      commit('changeUserNav', navList)
      cache.setCache('jxcms-userNav', navList)
    }
}

这样我们就定义好了,只需要调用store.dispatch('requestUserNav') 就可以动态生成路由。另外,因为vue-router4.0中将 router.addRoutes方法废除了,所以我们只能使用 router.addRoute 循环添加所有的路由。

三,最终完成动态添加路由

前面我们说过了,我们动态添加路由的时机就是二个,初始化和登录时候,所以我们现在就完成最后的部分。

// vuex中的user.js模块
//动态添加路由
import { mapMenu } from '@/util/map-menu.js'   //前面封装的函数
  state: {
  ...
  },
  mutations: {
  ...
  },
  actions: {
    async loginUser({ dispatch, commit }, info) {
      const loginRes = await loginUser(info)
      if (loginRes.uName) {
        if (!cache.getCache('jxcms-token')) {
          ElMessage({
            message: '登录成功!',
            type: 'success'
          })
        }
        commit('changeUser', loginRes)
        //本地存储
        cache.setCache('jxcms-user', loginRes)
        dispatch('requestUserNav')	//执行动态生成路由
       	router.push('/roles')
        cache.setCache('jxcms-token', loginRes.token)
      } else {
        ElMessage({
          message: '登录失败',
          type: 'error'
        })
      }
    }
}

这里我们完成第一个动态添加路由的时机,登录成功时候,进行动态路由添加。

// vuex中的根模块 index.js
  actions: {
    initializationData({ dispatch, commit }) {	//vuex初始化函数
      const navList = cache.getCache('jxcms-userNav')
      commit('changeUserNav', navList)	//动态生成路由
      //要用同步的
      const user = cache.getCache('jxcms-user')
      commit('changeUser', user)
    }
  },
  modules: {
    user,
    nav,
    dept,
    roles
  }
// main.js
//初始化
store.dispatch('initializationData')

这里我们完成了动态生成路由的第二个时机:刷新页面时,初始化时候进行动态路由生成. 因为刷新页面时候用户可能是登录状态,这样我们就不能通过登录成功来触发动态路由添加,就需要我们主动进行动态路由生成,在初始化时候,获取到本地存储的菜单信息,如果用户没有登录,本地的菜单信息会被清除。
另外,这里我使用的是commit来提交mutations,而不是actions函数,这是因为我在测试过程中发现,如果我使用actions,那么我在进入路由页面前,路由并没有创建成功,会报错,而使用mutations,因为是同步的,所以不会出现这个情况。这个问题后面如果找到解决办法,会重新进行修改。文章来源地址https://www.toymoban.com/news/detail-403211.html

到了这里,关于vue实现动态路由添加(简单无废话版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 动态添加路由刷新后页面丢失(白屏)问题

    动态添加路由操作一般是用vuex或者Pinia封装,在登录页面调用 如果出现刷新页面丢失有两种可能: 1:vuex或者Pinia没有做持久化处理 2:动态添加路由需要在main.ts里面也调用一次 不需要路由守卫即可实现 注意:必须要在页面挂载前还有路由配置完成前调用添加,不然还是丢

    2024年02月16日
    浏览(56)
  • vue3 中动态添加路由出现的问题 [Vue Router warn]: No match found for location with path “xxx“

    最近想尝试 vue3 + elementplus + axios + pinia 封装一个通用的后台模板,写到 vue-router 添加动态路由时,有一个不影响代码运行但是又有提示的报错,因此进行记录,方便大家进行解决 图片圈出的路由是动态加载的路由 404等报错页面不再需要放在所有路由后面,可在一开始的时候

    2024年02月09日
    浏览(55)
  • 路由原理及vue实现动态路由

    在前端开发中,路由通常用于实现 SPA 应用程序,即在一个页面中切换不同的内容或页面,而不需要重新加载整个页面。路由的实现原理是通过监听 URL 的变化,然后根据不同的 URL 加载不同的内容或页面。 在前端框架中,例如 Vue,路由通常是通过路由库来实现的。路由库提

    2024年02月06日
    浏览(44)
  • vue 实现动态路由

    vue-router对象中的 addRoutes ,用它来动态添加路由配置 格式: 举个例子: 我是以 vue-admin-template 为例,做如下演示: 在router/index.js中的路由配置中 只保留静态路由(因为我们要动态的添加)) 在permission.js中引入,并使用addRoutes动态添加 这个是 router 下的 index.js中定义的 静态

    2024年02月01日
    浏览(40)
  • Vue实现动态路由

    目录 前言 一、项目介绍 1.开发环境 2.功能 3.项目运行截图   二、实现 1.动态路由如何实现 2.项目目录介绍 3.核心代码 4.坑和知识点 小结 最近在学权限相关的管理项目,前端用到了动态路由,就是根据用户角色显示不同的菜单,动态添加路由。说着好像很简单,但看了很多

    2024年02月06日
    浏览(35)
  • Vue实现动态路由【记录学习的快乐】

    1、什么是动态路由? 2、动态路由的好处 3、动态路由如何实现 1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现及页面的渲染。动态的路由存储可分为两种,一种是将路由存储到前端。另一种则

    2024年02月07日
    浏览(33)
  • 【vue】el-table实现动态添加行和列

    实现思路: 最近遇到一个动态增加行和列的需求,本来拿到需求的时候想用el-table中自带的方法去实现的,但是经过尝试发现不能满足想要实现的需求。没办法只能在el-table的基础上自己写原生。 大概思路如下: 1.首先把table中需要动态增加的行和列分开,分别定义一个数组

    2024年02月11日
    浏览(46)
  • [VUE学习]权限管理系统前端vue实现9-动态路由,动态标签页,动态面包屑

                    在总体布局页面添加router router-view 是 Vue Router 提供的组件,用于动态展示匹配到的路由组件内容。 通过在合适的位置放置 router-view ,你可以根据路由路径动态地渲染对应的组件内容。                     因为我们是多级页面 之后动态路由也是多级的 如

    2024年02月13日
    浏览(46)
  • Vue从后端取数据,实现动态路由

            将获取菜单的方法放在全局中,以便每次刷新页面时,能够加载出。 this.$store.state.userInfo 是登入后存放在Vuex的用户信息  按照上面要求即可实现

    2024年01月20日
    浏览(39)
  • Vue如何实现权限管理(动态路由addRoutes)

    目录 引言 推荐B站视频 一、权限管理 二、控制权限 接口权限 路由权限控制 方法一 方法二 菜单权限 方法一 方法二 按钮权限 方法一 方法二 项目中会遇到权限管理,来让特定用户有特定权限的场景,那么怎么做这个权限管理,以及有多少办法呢,下面给大家絮叨 vue权限管

    2023年04月25日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包