iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue router动态路由如何实现
  • 935
分享到

Vue router动态路由如何实现

2023-07-05 11:07:21 935人浏览 安东尼
摘要

本文小编为大家详细介绍“Vue router动态路由如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue router动态路由如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实

本文小编为大家详细介绍“Vue router动态路由如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue router动态路由如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

实现思路

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

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

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

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

然后利用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)// 解决重复点击路由报错的BUGConst originalPush = VueRouter.prototype.pushVueRouter.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存储获取到的动态路由信息后,在刷新页面时,动态路由信息是会丢失,// 从而导致页面404router.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 ><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 /srcimport {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 viewsconst loadView = (viewPath) => {    return () => import('@/views/' + viewPath)}// Handle routersconst 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动态路由如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Vue router动态路由如何实现

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

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

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

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

下载Word文档
猜你喜欢
  • Vue router动态路由如何实现
    本文小编为大家详细介绍“Vue router动态路由如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue router动态路由如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实...
    99+
    2023-07-05
  • vue router 动态路由清除方式
    目录router 动态路由清除vue-router退出登录清空路由router 动态路由清除 重置matcher可达到路由还原效果 在用户退出时调用 resetRouter(rout...
    99+
    2022-11-13
  • vue-router前端路由之如何实现路由传值
    小编给大家分享一下vue-router前端路由之如何实现路由传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!路由传值在前端的路...
    99+
    2022-10-19
  • Vue如何实现动态路由导航
    这篇文章主要介绍“Vue如何实现动态路由导航”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue如何实现动态路由导航”文章能帮助大家解决问题。1、导航守卫“导航” 表示路由正在发生改变正如其名,vu...
    99+
    2023-07-05
  • VUE路由动态加载如何实现
    这篇文章主要讲解了“VUE路由动态加载如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE路由动态加载如何实现”吧!首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多...
    99+
    2023-07-04
  • vue-router如何实现路由懒加载
    这篇文章主要为大家展示了“vue-router如何实现路由懒加载”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue-router如何实现路由懒加载”这篇文章吧...
    99+
    2022-10-19
  • vue实现动态路由详细
    目录一、前端控制1、在router.js文件(把静态路由和动态路由分别写在router.js) 2、store/permission.js(在vuex维护一个state,通过配角色来...
    99+
    2022-11-12
  • Vue--Router动态路由的用法示例详解
    目录官网网址动态路由概述同一路由多个参数path-to-regexpApi用法1. pathToRegexp()2、exec()3. parse()4. compile()本文介绍V...
    99+
    2022-11-13
    Vue Router动态路由 Vue Router路由 Vue Router动态路由用法
  • vue router动态路由清除方式是什么
    这篇文章主要介绍“vue router动态路由清除方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue router动态路由清除方式是什么”文章能帮助大家解决问题。ro...
    99+
    2023-06-30
  • vue-router如何实时动态替换路由参数(地址栏参数)
    目录实时动态替换路由参数(地址栏参数)应用场景用法如下replace()和push() 的区别动态替换路由-Url参数安装webpack-merge引入包操作参数实时动态替...
    99+
    2022-11-13
  • 怎么用vue实现动态路由
    这篇文章主要介绍了怎么用vue实现动态路由的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用vue实现动态路由文章都会有所收获,下面我们一起来看看吧。1、什么是动态路由?动态路由,动态即不是写死的,是可变的。...
    99+
    2023-07-02
  • Vue 动态路由的实现详情
    前言: 动态路由是一个常用的功能,根据后台返回的路由json表,前端动态显示可跳转的路由项,下面来讲解一下具体的实现方式: 大致业务需求:前端在login登陆页,输入账号密码后,点击...
    99+
    2022-11-13
  • vue-router子路由的实现方式
    目录实验目的创建Admin页面创建子页面修改router/index.js代码总结在应用界面开发中通常由多层嵌套的组件组合而成。 但随着页面的增多,如果把所有的页面都塞到一个 rou...
    99+
    2023-02-06
    vue-router子路由 vue-router路由 vue-router实现子路由
  • vue如何使用router-link实现路由跳转
    这篇文章主要介绍vue如何使用router-link实现路由跳转,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!router-link 【实现跳转最简单的方法】<router-link to='...
    99+
    2023-06-18
  • vue-admin-template动态路由怎么实现
    本篇内容介绍了“vue-admin-template动态路由怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!提供登录与获取用户信息数据...
    99+
    2023-06-25
  • 怎么用Vue-Router实现路由功能
    这篇“怎么用Vue-Router实现路由功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用Vue-Router实现路由...
    99+
    2023-07-04
  • 手把手教你vue实现动态路由
    目录1、什么是动态路由?2、动态路由的好处3、动态路由如何实现总结1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现...
    99+
    2022-11-13
  • 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
  • vue一步到位的实现动态路由
    目录静态路由的回顾动态路由的配置说一些笔者遇到的问题后记最近在写vue项目,需要由后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由),就是配置vue动态路由啦...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作