iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vuerouter动态路由实现过程
  • 675
分享到

Vuerouter动态路由实现过程

Vuerouter动态路由Vue动态路由 2023-03-14 11:03:05 675人浏览 薄情痞子
摘要

目录实现思路环境介绍实现过程路由数据(demo)??? Vue动态路由(约定路由),听起来好像很玄乎的样子? 但是你要是理解了实现思路,你会发现,没有想象中的那么难? 在没有亲自实现

??? Vue动态路由(约定路由),听起来好像很玄乎的样子? 但是你要是理解了实现思路,你会发现,没有想象中的那么难?

在没有亲自实现功能前,永远不要低估自己的个人实力和潜力???

???下面是本人一个刚从服务端开发转职前端开发的程序猿的实现过程???

实现思路

思路其实很简单,也很明确:

1、将路由分为静态路由(staticRouters)、动态路由

2、静态路由初始化时正常加载

3、用户登陆后,获取相关动态路由数据,

4、然后利用vue:addRoute追加到vue实例中即可。 实现思路虽然很简单,但是过程并不是一帆风顺,需要注意的细节还是很多的

环境介绍

  • vue-cli: v4.x.x
  • vue: v2.6.11
  • vuex: v3.4.0
  • vue-router: v3.2.0

实现过程

路由文件处理(router/index.js):

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeLayout from '../layouts/HomeLayout'
import store from '@/store/index'
Vue.use(VueRouter)
// 解决重复点击路由报错的BUG
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
    return originalPush.call(this, location).catch((err) => err)
}
const routes = [
	{
		path: '/',
		name: 'homeBase',
		component: HomeLayout,
		redirect: {
			name: 'home'
		},
		children: [
			// 门户路由
			{
				path: 'home',
				name: 'home',
				component: () => import('../views/portal/Home.vue'),
			},
			{
				path: 'lists',
				name: 'lists',
				component: () => import('../views/portal/Lists.vue'),	
			},
			{
				path: 'detail',
				name: 'detail',
				component: () => import('../views/portal/Detail.vue'),	
			},
		]
	},
]
// 定义静态路由集合
const staticRouterMap = [
	'home',
	'lists',
	'detail'
]
const router = new VueRouter({
	mode: 'history',
	base: process.env.BASE_URL,
	routes,
})
// 路由全局拦截
// 以下可根据业务逻辑自行在拦截路由中进行处理,此处仅以本人业务作为示例展示
// 本示例以 vuex+sessionStorage相互配合完成动态路由的数据存储
// 仅以vuex存储获取到的动态路由信息后,在刷新页面时,动态路由信息是会丢失,
// 从而导致页面404
router.beforeEach((to, from, next) => {
	const userState = JSON.parse(sessionStorage.getItem('userState'))
	if (!userState || !userState.isLogin) {
		// 没有登录
		// 如果前往页面非公共路由,则跳转至首页
		if (staticRouterMap.indexOf(to.name) < 0) {
			next({name: 'home'})
		} else {
			next()
		}
	} else {
		// 登录
		// 已经存在路由列表: 注意刚登陆成功第一次调转route时相应store数据还未更新
		const hasGetRoute = store.getters['user/hasGetRoute']
		const routeMap = JSON.parse(sessionStorage.getItem('routeMap'))
		if(!hasGetRoute && routeMap) {
            // 刷新页面且有route记录数据,可再次追加动态路由
			store.dispatch('user/updateRouteOfUser', routeMap)
			next({...to, replace: true})
		} else {
			next()
		}
	}
})
export default router

view数据处理

<template>
	<div class="home">
		<div>
			这是demo
		</div>
		<div>
			<div v-show="!isLogin">
				<a-divider>调用接口: 模拟登陆</a-divider>
				<div style="margin-top:5px;">
					<a-space :size="size">
						<a-button type="primary" @click="login()">
							用户登陆
						</a-button>
					</a-space>
					<p>{{loading}}</p>
				</div>
			</div>
		</div>
	</div>
</template>
<script>
	// @ is an alias to /src
	import {
		Base64
	} from 'js-base64'
	import User from '../../api/user'
	import {
		mapGetters,
		mapMutations,
		mapActions
	} from 'vuex'
	export default {
		name: 'home',
		data() {
			return {
				size: "middle",
				user: {
					'name': 'xxxx',
					'pass': Base64.encode('xxxx')
				},
			}
		},
		components: {},
		computed: {
			...mapGetters('user', ['isLogin', 'userInfo', 'hasGetRoute'])
		},
		methods: {
			...mapMutations('user', ['setUserState']),
			...mapActions('user', ['getUserInfo', 'getDynamicRouteOfUser']),
			login() {
				if (this.isLogin) {
					this.$router.push({
						path: '/user'
					})
				} else {
					// 模拟用户
					User.login(this.user).then(res => {
						this.setUserState({
							'isLogin': true,
							'ut': res.data.user_token,
							'userType': 1
						})
						this.getUserInfo()
						//以下就是根据用户登陆信息,获取动态路由信息操作
						this.getDynamicRouteOfUser(type).then(() => {
							this.$router.push({
								path: '/user'
							})
						})
					}).catch(() => {
					})
				}
			},
		},
	}
</script>
<style lang="sCSS" scoped>
	.home {
		padding: 20px;
	}
</style>

vuex

import VueRouter from '../../router'
import UserApi from '../../api/user'
import axiOS from 'axios'
import TeacherLayout from '@/layouts/Layout'
import NotFound from '@/layouts/404'
const user = {
    namespaced: true,
    state: {
        // 用户状态相关 
        userState: JSON.parse(sessionStorage.getItem('userState')) || {ut: '', isLogin: false, userType: null},
        // 用户信息相关
        userInfo: JSON.parse(sessionStorage.getItem('userInfo')) || {},
        // 是否获取route
        hasGetRoute: false,
        // routeMap
        routeMap: JSON.parse(sessionStorage.getItem('routeMap')) || [],
    },
    getters: {
        ut : state => state.userState.ut,
        isLogin: state => !!state.userState.isLogin,
        userInfo: state => state.userInfo,
        hasGetRoute: state => state.hasGetRoute,
        routeMap: state => state.routeMap[0].children,
    },
    mutations: {
        setUserState(state, playload) {
            state.userState = playload
            sessionStorage.setItem('userState', JSON.stringify(state.userState))
        },
        setUserInfo(state, playload) {
            state.userInfo = playload
            sessionStorage.setItem('userInfo', JSON.stringify(state.userInfo))
        },
        setRouteMap(state, routers) {
            state.routeMap = routers
            // 为了防止用户刷新页面导致动态创建的路由失效,将其存储在本地中
            sessionStorage.setItem('routeMap', JSON.stringify(routers));
        },
        setDynamicRouteMap(state, routers) {
            state.hasGetRoute = true
            let routerMaps = filterRouter(routers)
            // 最后追加404路由
            routerMaps.push({
                path: '*',
                component: NotFound
            })
            // 追加路由
            // 这块是重点,如果直接使用addRoute是无效的
            routerMaps.forEach(item => {
                VueRouter.addRoute(item);
            })
        },
        resetLogin() {
            sessionStorage.clear()
        }
    },
    actions: {
        // 获取用户信息
        async getUserInfo({commit}) {
            await UserApi.user().then(res => {
                commit('setUserInfo', res)
            }).catch(error => {
                console.log(error)
            })
        },
        // 获取用户授权动态路由
        async getDynamicRouteOfUser({commit}, type) {
            let flag = false
            // mock api
            mockRouter().then(res => {
                commit('setRouteMap', res.data)
                commit('setDynamicRouteMap', res.data)
                flag = true
            }).catch(err => {
                console.log(err)
            })
            return flag
        },
        // 刷新重置路由
        updateRouteOfUser({commit}, routerMap) {
            commit('setDynamicRouteMap', routerMap)
        },
    }
}
// handle views
const loadView = (viewPath) => {
    return () => import('@/views/' + viewPath)
}
// Handle routers
const filterRouter = (routers) => {
    return routers.filter((router) => {
   		// 区分布局与视图文件,因为加载方式不同
        if (router.component === 'Layout') {
            router.component = Layout
        }else {
            // view
            router.component = loadView(router.component)
        }
        // 删除路由记录中的无用字段:这段是本示例与后台协商的,但在vue-router中不被支持的字段信息,可忽略
        if (!router.redirect || !router.redirect.length) { delete router.redirect }
        // 判断是否存在子路由,并递归调用自己
        if(router.children && router.children.length) {
            router.children = filterRouter(router.children)
        }
        return true
    })
} 
// mock 数据
async function mockRouter() {
    const url = 'Http://localhost:8080/t.json'
    let routerData
    await axios.get(url).then(res => {
        routerData = res.data
    }).catch(err => {
        console.log(err)
    })
    return routerData
}
export default user;

路由数据(demo)

贡献本人于服务端约定的路由数据结构,仅供参考

{
    "data":[
        {
            "title":"demo",
            "name":"x",
            "pname":"",
            "path": "/x",
            "type": 1,
            "component": "Layout",
            "redirect": {"name": "xx"},
            "children": [
                {
                    "title":"child1",
                    "name":"xx",
                    "pname":"x",
                    "path": "",
                    "type": 2,
                    "icon": "desktop",
                    "component": "xx.vue",
                    "redirect": {}
                },
                {
                    "title":"child1",
                    "name":"xx",
                    "pname":"tBase",
                    "path": "xx",
                    "type": 2,
                    "icon": "container",
                    "component": "xx.vue",
                    "redirect": {"name": "xxx"},
                    "children": [
                        {
                            "title":"child2",
                            "name":"xx",
                            "pname":"xx",
                            "path": "xx",
                            "type": 2,
                            "icon": "unordered-list",
                            "component": "xx.vue",
                            "redirect": {} 
                        }
                    ]
                },
            ]
        }
    ]
}

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

--结束END--

本文标题: Vuerouter动态路由实现过程

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

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

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

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

下载Word文档
猜你喜欢
  • Vuerouter动态路由实现过程
    目录实现思路环境介绍实现过程路由数据(demo) vue动态路由(约定路由),听起来好像很玄乎的样子 但是你要是理解了实现思路,你会发现,没有想象中的那么难 在没有亲自实现功能前,永...
    99+
    2023-03-14
    Vue router动态路由 Vue动态路由
  • vueRouter--matcher之动态增减路由方式
    目录matcher之动态增减路由解决办法番外vueRouter动态追加路由具体路由拦截全在router.beforeEach里处理curPath用于辅助处理matcher之动态增减路...
    99+
    2022-11-13
  • vueRouter matcher动态增减路由方式是什么
    今天小编给大家分享一下vueRouter matcher动态增减路由方式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-06-30
  • vue实现动态路由详细
    目录一、前端控制1、在router.js文件(把静态路由和动态路由分别写在router.js) 2、store/permission.js(在vuex维护一个state,通过配角色来...
    99+
    2022-11-12
  • React路由动画切换实现过程详解
    目录1.下载2.配置3.引入css4.结合animate库1.下载 cnpm install react-transition-group --save 2.配置 在路由配置文件/s...
    99+
    2022-12-08
    React路由动画切换 React路由切换
  • Vue router动态路由如何实现
    本文小编为大家详细介绍“Vue router动态路由如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue router动态路由如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实...
    99+
    2023-07-05
  • 怎么用vue实现动态路由
    这篇文章主要介绍了怎么用vue实现动态路由的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用vue实现动态路由文章都会有所收获,下面我们一起来看看吧。1、什么是动态路由?动态路由,动态即不是写死的,是可变的。...
    99+
    2023-07-02
  • Vue 动态路由的实现详情
    前言: 动态路由是一个常用的功能,根据后台返回的路由json表,前端动态显示可跳转的路由项,下面来讲解一下具体的实现方式: 大致业务需求:前端在login登陆页,输入账号密码后,点击...
    99+
    2022-11-13
  • ReactRouter中实现嵌套路由和动态路由的示例
    目录Router 组件的实现Routes 组件的实现Link 组件的实现Switch组件的实现createBrowserHistory 函数实现React Router 是...
    99+
    2023-05-19
    React Router 嵌套路由和动态路由 React Router 嵌套路由 React Router动态路由
  • nacos gateway动态路由实战
    目录nacos gateway动态路由一、引入本次测试需要的pom依赖二、配置文件设置(*配置文件不生效的把名字改为bootstrap.yml)三、动态路由实现四、nacos配置中心...
    99+
    2022-11-12
  • el-menu动态加载路由的实现
    先看需要实现的效果 这里有一级也有二级菜单,注意二级菜单的父目录(”选项设置“点击不会跳转,只是展开目录),然后点击去详情页,需要跳到一个隐藏的路由,不在菜...
    99+
    2023-05-15
    el-menu动态加载路由 el-menu动态路由
  • Vue如何实现动态路由导航
    这篇文章主要介绍“Vue如何实现动态路由导航”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue如何实现动态路由导航”文章能帮助大家解决问题。1、导航守卫“导航” 表示路由正在发生改变正如其名,vu...
    99+
    2023-07-05
  • VUE路由动态加载如何实现
    这篇文章主要讲解了“VUE路由动态加载如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE路由动态加载如何实现”吧!首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多...
    99+
    2023-07-04
  • vue-admin-template动态路由怎么实现
    本篇内容介绍了“vue-admin-template动态路由怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!提供登录与获取用户信息数据...
    99+
    2023-06-25
  • 如何在Go语言中实现路由的动态路由匹配
    Go语言是一门快速、高效、安全、并发的编程语言,被越来越多的开发者广泛应用于Web开发中。在Web应用程序中,路由是非常重要的一环,它的作用是将请求分发到不同的处理器函数中。在此基础上,动态路由匹配更是一种灵活、高效的路由实现方式。本文将介...
    99+
    2023-12-17
    Go语言 路由 动态匹配
  • 如何使用Quagga实现Linux动态路由
    这篇文章给大家分享的是有关如何使用Quagga实现Linux动态路由的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。OSPF 的意思是最短路径优先Open Shortest Path First。OSPF &nbs...
    99+
    2023-06-16
  • 手把手教你vue实现动态路由
    目录1、什么是动态路由?2、动态路由的好处3、动态路由如何实现总结1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现...
    99+
    2022-11-13
  • Spring Cloud Gateway动态路由Apollo实现详解
    目录背景路由的加载实现动态路由背景 在之前我们了解的Spring Cloud Gateway配置路由方式有两种方式 通过配置文件 spring: cloud: gatew...
    99+
    2022-11-13
    Spring Cloud Gateway Apollo Spring Cloud Gateway 动态路由
  • vue-admin-template 动态路由的实现示例
    提供登录与获取用户信息数据接口 在api/user.js中 import request from '@/utils/request' const Api = { Take...
    99+
    2022-11-12
  • VUE中怎么实现路由动态加载
    VUE中怎么实现路由动态加载,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多,...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作