iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >手把手教你vue实现动态路由
  • 381
分享到

手把手教你vue实现动态路由

2024-04-02 19:04:59 381人浏览 安东尼
摘要

目录1、什么是动态路由?2、动态路由的好处3、动态路由如何实现总结1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现

1、什么是动态路由?

动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现及页面的渲染。动态的路由存储可分为两种,一种是将路由存储到前端。另一种则是将路由存储到数据库。动态路由的使用一般结合角色权限控制一起使用。

总结:

     1)路由可变,不是写死的,动态加载

     2)存储分两种:存前端,存数据库

2、动态路由的好处

使用动态路由可以跟灵活,无需手工维护,我们可以使用一个页面对路由进行维护。如果将路由存储到数据库,还可以增加安全性。

总结:

     1)灵活,无需手工维护

     2)增加安全性

3、动态路由如何实现

在此以路由存储在数据库为例

流程:一般我们在登录的时候,根据登录用户的角色返回此角色可以访问的页面的路由,前端将路由存储到Vuex(vuex存储的数据必须可持久的,不要一刷新页面就不见),我们在路由前置守卫处动态添加拿到的路由,对页面进行渲染。

1)此为我的router目录,index.js对路由添加,守卫拦截等处理。static-route.js为前端定义的静态路由,不需要动态加载的,如登陆页面,忘记密码页面,404页面等。

index.js

import Vue from 'vue'
import $cookies from 'vue-cookies'
import VueRouter from 'vue-router'
import store from '../store'​
import staticRoute from './static-route.js'​​​
Vue.use(VueRouter)​​
const router = new VueRouter({
	mode: 'history',
	base: process.env.BASE_URL,
	routes: staticRoute //staticRoute为静态路由,不需动态添加
})​
let isToken = true
router.beforeEach(async (to, from, next) => {
	//定义isToken为true和vuex不为空时添加路由
	if (isToken && store.state.routers.routers.length != 0) {
		//从vuex中获取动态路由
		const accessRouteses = await store.state.routers.routers;
		//动态路由循环解析和添加
		accessRouteses.forEach(v => {
			v.children = routerChildren(v.children);
			v.component = routerCom(v.component);
			router.addRoute(v); //添加
		})
		isToken = false //将isToken赋为 false ,否则会一直循环,崩溃
		next({
			...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
			replace: true, // 重进一次, 不保留重复历史
		})​
	} else {
		if (to.name == null) {
			next("/404")
		} else {
			if (to.meta.title) { //判断是否有标题
				document.title = to.meta.title //给相应页面添加标题
			}
			next()
		}​
	}​
})​
function routerCom(path) { //对路由的component解析
	return (resolve) => require([`@/views/${path}`], resolve);
}​
function routerChildren(children) { //对子路由的component解析
	children.forEach(v => {
		v.component = routerCom(v.component);
		if (v.children != undefined) {
			v.children = routerChildren(v.children)
		}
	})
	return children
}​​
export default router​

2)登陆成功后将获取到的动态路由存储到vuex

vuex—>index.js

import Vue from 'vue'
import Vuex from 'vuex'
//数据持久化
import createPersistedState from "vuex-persistedstate";
​
Vue.use(Vuex)
const routers = {
  namespaced: true,
  state: () => ({
    routers:"",
  }),
  mutations: {
    routers(state, newsdata) {
      state.routers = newsdata
    },
​
  },
  actions: {
    routers(context) {
      context.commit('routers')
    },
  },
  getters: {
    routers(state) {
      console.log("getters", state)
      return state.routers
    },
    
  }
}
​
​
const store = new Vuex.Store({
  modules: {
    routers: routers,
  },
  
  // 数据持久化
  plugins: [createPersistedState({
    //key是存储数据的键名
    key: 'routersData',
    //paths是存储state中的那些数据,如果是模块下具体的数据需要加上模块名称,如user.token  
    paths: ["routers.routers"]
  })]
})
​
​
export default store

我的动态路由模板

//动态路由
const dynamicRoute = [{
  "path": "/main",
  "name": "main",
  "redirect": "/main/index",
  "component": "main/main.vue",
  "children": [{
      "path": "index",
      "name": "index",
      "component": "index/index.vue",
      "meta": {
        "name": "index",
        "title": "首页",
        "icon": "el-icon-location",
        "menu":true //true为菜单栏
      }
    },
    {
      "path": "Configuration",
      "name": "Configuration",
      "redirect": "Configuration/route",
      "component": "Configuration/index.vue",
      "roles": ['developer', "admin"], //  developer、admin角色的用户才能访问该页面
      "meta": {
        "title": "配置",
        "icon": "el-icon-location",
        "menu":true
      },
      "children": [{
          "path": "route",
          "name": "route",
          "component": "Configuration/route/index.vue",
          "meta": {
            "title": "菜单",
            "icon": "",
            "menu":true
          },
        }, {
          "path": "user",
          "name": "user",
          "component": "Configuration/user/index.vue",
          "meta": {
            "title": "用户管理",
            "icon": "el-icon-location",
            "menu":true
          },
        },
        {
          "path": "admin",
          "name": "admin",
          "component": "Configuration/admin/index.vue",
          "meta": {
            "title": "管理员管理",
            "icon": "",
            "menu":true
          },
        },
        
        {
          "path": "userEdit",
          "name": "userEdit",
          "component": "Configuration/user/user-Edit.vue",
          "meta": {
            "title": "编辑用户",
            "icon": "",
            "menu":false
          },
        },  
      ]
    },
    {
      "path": "check",
      "name": "check",
      "redirect": "check/user",
      "component": "check/index.vue",
      "roles": ['developer', "admin", "check"], //  developer、admin角色的用户才能访问该页面
      "meta": {
        "title": "审核",
        "icon": "el-icon-location",
        "menu":true
      },
      "children": [{
          "path": "user",
          "name": "checkUser",
          "component": "check/check-user/index.vue",
          "meta": {
            "title": "用户实名审核",
            "icon": "el-icon-location",
            "menu":true
          }
        },
        {
          "path": "enterprise",
          "name": "checkEnterprise",
          "component": "check/check-enterprise/index.vue",
          "meta": {
            "title": "企业认证审核",
            "icon": "el-icon-location",
            "menu":true
          },
        },
        {
          "path": "checkNORMImage",
          "name": "checkNormImage",
          "component": "check/check-norm-image/index.vue",
          "meta": {
            "title": "标准照认证审核",
            "icon": "el-icon-location",
            "menu":true
          },
        },
        {
          "path": "checkHiringJobs",
          "name": "checkHiringJobs",
          "component": "check/check-hiring-Jobs/index.vue",
          "meta": {
            "title": "求职、招聘认证审核",
            "icon": "el-icon-location",
            "menu":true
          },
        }
      ]
​
    }
  ]
}, ]
export default dynamicRoute

路由管理界面(可能有不完善的地方)

讲一讲遇到的坑及注意点

1)“component”: “check/check-norm-image/index.vue”, 用字符串再在解析,不要像静态路由一样。否则第一次进去可以,刷新就变空白

2)此处为重要的一点,直接用next()不行

next({
      ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
      replace: true, // 重进一次, 不保留重复历史
    })

3)由于添加完路由还会重复执行一遍路由守卫,所有必须确保不要一直死循环添加路由。否则直接崩溃。这里我用的是isToken变量确保不循环。

总结

到此这篇关于vue实现动态路由的文章就介绍到这了,更多相关vue实现动态路由内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 手把手教你vue实现动态路由

本文链接: https://www.lsjlt.com/news/154004.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 手把手教你vue实现动态路由
    目录1、什么是动态路由?2、动态路由的好处3、动态路由如何实现总结1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现...
    99+
    2024-04-02
  • 手把手教你Vue3实现路由跳转
    目录一、安装 vue-router二、新建 vue 页面2.1 login.vue2.2 register.vue三、新建路由文件3.1 新建 index.js3.2 新建 rout...
    99+
    2024-04-02
  • CSS动画教程:手把手教你实现震动特效
    引言:在现代Web开发中,动画效果的应用越来越广泛。CSS动画是一种简单而强大的实现动画效果的方法。本文将带您一起学习如何使用CSS动画实现震动特效,并提供具体的代码示例。一、了解CSS动画基础知识在使用CSS动画之前,我们需要了解一些基础...
    99+
    2023-10-21
    CSS动画 手把手教程 震动特效
  • CSS动画教程:手把手教你实现脉冲特效
    引言:CSS动画是网页设计中常用的一种效果,它可以为网页增添活力和视觉吸引力。本篇文章将带您深入了解如何利用CSS实现脉冲特效,并提供具体的代码示例教您一步步完成。一、了解脉冲特效脉冲特效是一种循环变化的动画效果,通常用在按钮、图标或其他元...
    99+
    2023-10-21
    CSS动画 教程 脉冲
  • CSS动画教程:手把手教你实现翻页特效
    CSS动画教程:手把手教你实现翻页特效,需要具体代码示例CSS动画是现代网站设计中必不可少的一部分。它可以为网页增添生动感,吸引用户的注意力,并且提高用户体验。其中一种常见的CSS动画效果就是翻页特效。在这篇教程中,我将带领大家一步一步实现...
    99+
    2023-10-24
    CSS动画 翻页特效 手把手教程
  • CSS动画教程:手把手教你实现旋转特效
    引言:CSS动画是现代网页设计的重要组成部分之一,通过CSS动画可以为网页增加交互性和视觉吸引力。本文将教你如何使用CSS实现一个简单而漂亮的旋转特效,通过简单的代码示例,让你轻松掌握该技巧。创建HTML结构:首先,我们需要创建一个HTML...
    99+
    2023-10-21
    CSS动画 手把手教 旋转特效
  • CSS动画教程:手把手教你实现可拖动的特效
    在现代Web开发中,动画效果已经成为了提高用户体验和吸引用户注意力的重要手段之一。CSS动画是一种轻量级、简单易用的实现动画效果的方法,常用来实现页面元素的过渡、动态效果和交互特效。本文将为大家介绍一种利用CSS动画实现可拖动特效的方法,并...
    99+
    2023-10-21
    CSS动画 手把手教程 可拖动特效
  • CSS动画教程:手把手教你实现跃动背景特效
    在网页设计中,动画效果可以增添页面的生动感,吸引用户的注意力。而CSS动画则是实现这些效果的一种方法。本教程将手把手教你如何利用CSS实现一个跃动背景特效,通过具体的代码示例来让你更容易理解和应用。步骤一:创建HTML结构首先,我们需要创建...
    99+
    2023-10-21
    CSS动画 背景 跃动
  • 手把手教你使用TensorFlow2实现RNN
    目录概述权重共享计算过程:案例数据集RNN 层获取数据完整代码概述 RNN (Recurrent Netural Network) 是用于处理序列数据的神经网络. 所谓序列数据, 即...
    99+
    2024-04-02
  • CSS动画教程:手把手教你实现闪电球特效
    在网页设计中,动画效果可以为页面增添生动的感觉,吸引用户的注意力。而CSS动画则是实现这些效果的一种简单且有效的方法之一。本文将介绍如何通过CSS来创建一个闪电球特效,让你的页面更加有趣有活力。首先,我们需要准备一些基本的HTML结构。以下...
    99+
    2023-10-21
    CSS动画 手把手教 闪电球特效
  • 手把手教你在vue中使用three.js
    目录在vue中使用three.js1.首先安装three.js、引入2.在页面内写入three.js 总结在vue中使用three.js 下面我会介绍three.js的基础...
    99+
    2023-03-01
    vue使用threejs threejs教程 three.js案例
  • CSS动画教程:手把手教你实现旋转缩放特效
    CSS动画是实现网页交互效果的重要技术之一。本教程将手把手地教你如何使用CSS实现旋转缩放特效。在学习本教程之前,请确保你对CSS基础有一定的了解。准备工作在开始之前,你需要一个编辑器来编写代码,比如Sublime Text、Visual ...
    99+
    2023-10-21
    CSS动画 缩放 旋转
  • CSS动画教程:手把手教你实现闪烁背景特效
    引言:在网页设计中,动画效果可以为网页增添活力和吸引力。CSS动画是一种简单而强大的实现动画效果的方法。本教程将手把手地教你如何使用CSS动画来实现闪烁背景特效,并提供具体的代码示例。一、HTML结构首先,我们需要创建一个包含要应用动画的元...
    99+
    2023-10-21
    CSS动画 闪烁 背景特效
  • CSS动画教程:手把手教你实现闪烁文本特效
    CSS动画教程:手把手教你实现闪烁文本特效CSS(Cascading Style Sheets)是一种用于为网页添加样式和布局的标记语言。通过使用CSS,我们可以为HTML元素添加动画效果,使网页更加生动和吸引人。在本教程中,我将向您展示如...
    99+
    2023-10-22
    动画 CSS 闪烁
  • CSS动画教程:手把手教你实现缩放渐变特效
    在现代Web设计中,动画效果是吸引用户注意力和增强用户体验的重要元素之一。CSS动画是一种基于CSS样式属性的动画效果,可以通过改变元素的样式属性值来实现动态效果。在本文中,我们将手把手地教你如何使用CSS动画实现缩放渐变特效,同时附带具体...
    99+
    2023-10-21
    CSS动画 缩放 渐变
  • CSS动画教程:手把手教你实现流水流光特效
    前言:CSS动画是网页设计中常用的技术,它使得网页更生动有趣,吸引用户的注意力。在这篇教程中,我们将会学习如何使用CSS实现一个流水流光的特效,并提供具体的代码示例。让我们开始吧!第一步:HTML结构首先,我们需要创建一个基本的HTML结构...
    99+
    2023-10-21
    CSS动画 教程 流水流光
  • CSS动画教程:手把手教你实现球体抛掷特效
    简介:在现代Web设计中,CSS动画已成为一个不可或缺的元素。它可以为网页增添生动感和趣味性,并提升用户体验。本教程将教你如何使用CSS实现球体抛掷特效,通过手把手的示范,让你轻松掌握这一技巧。步骤1:创建HTML结构首先,我们需要创建一个...
    99+
    2023-10-21
    CSS动画 特效 球体
  • CSS动画教程:手把手教你实现淡入淡出效果
    在网页设计和开发中,动画效果可以让页面更加生动和吸引人。而CSS动画是一种简单而且强大的方式来实现这种效果。本篇文章将手把手教你如何使用CSS来实现淡入淡出效果,并提供具体的代码示例供参考。一、淡入效果淡入效果是指元素从透明度为0逐渐变为透...
    99+
    2023-10-21
    CSS动画 淡入 淡出
  • 【Linux】手把手教你实现udp服务器
    网络套接字~ 文章目录 前言一、udp服务器的实现总结 前言 上一篇文章中我们讲到了很多的网络名词以及相关知识,下面我们就直接进入udp服务器的实现。 一、udp服务器的实现 首先我们需要创建五个文件(文件名可以自己命...
    99+
    2023-08-31
    c++ 后端 linux udp 服务器 网络协议 运维
  • vue实现动态路由详细
    目录一、前端控制1、在router.js文件(把静态路由和动态路由分别写在router.js) 2、store/permission.js(在vuex维护一个state,通过配角色来...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作