vite+vue3+ts+vuex+vue-router4.0路由总结

安装路由
yarn add vue-router@4
浅谈路由
根据项目需求,动态路由的部分从后端数据获取,获取的格式如下:

//模拟后端返回的数据
const menuLsit: Array<any> = [
    {
        url: "/home/person-home",
        name: "首页",
        meta: {
            title: "首页", icon: "HomeFilled"
        },
        children: [],
    },
    {
        url: "/list/list",
        name: "列表",
        meta: {
            title: "列表", icon: "Menu"
        },
        children: []
    },
    {
        url: "/system",
        name: "系统管理",
        meta: { title: "系统管理", icon: "tools" },
        children: [
            {
                url: "/system/user/user",
                name: "用户管理",
                meta: { title: "用户管理", icon: "User" },
                children: []
            },
            {
                url: "/system/menu/menu",
                name: "菜单管理",
                meta: {
                    title: "菜单管理", icon: "Menu"
                },
                children: []
            }, {

                url: "/system/operationRecord",
                name: "操作记录",
                meta: { title: "操作记录", icon: "tools" },
                children: [
                    {
                        url: "/system/operationRecord/loginRecord/loginError",
                        name: "异常日志",
                        meta: { title: "异常日志", icon: "User" },
                        children: []
                    },
                ]
            }
        ]
    },
    {
        url: "/form",
        meta: { title: "表单", icon: "Minus" },
        name: "表单",
        children: [
            {
                url: "/form/index",
                name: "表单管理",
                meta: { title: "表单管理", icon: "Minus" },
                children: []
            },
        ]
    },
];

export default menuLsit

数据从后端获取需要调用接口得到数据,如图所示
在这里插入图片描述
返回的格式需要做处理,动态路由的格式如下

import store from "@/store/index"
let temp: any[] = []
let list: any[] = []
//处理动态路径
export function routerPackag(itemList?: any) {
    itemList = JSON.parse(JSON.stringify(store.getters.menuLsit))
    if (itemList && itemList.length > 0) {
        getComponent(itemList)
        functionPackag(temp)
        return list
    }
}
const getComponent = (data: any[]) => {
    data.map((item: any, key: number) => {
        item.component = `../view${item.url}.vue`,
            item.path = item.url,
            item.meta = { title: item.name, icon: item.icon };
        item.name = item.name;
        if (item.children && item.children) {
            getComponent(item.children)
        }
        temp.push(item)
    })
}
function functionPackag(itemList: any) {
    const modules = import.meta.glob('../view/**/**.vue');
    const childrenList: Array<any> = []
    if (itemList) {
        itemList.map((item: any) => {
            if (item.component) {
                for (let key in modules) {
                    if (key === item.component) {
                        item.component = modules[key]
                        const obj: any = {
                            path: item.url,
                            name: item.name,
                            meta: item.meta,
                            component: item.component
                        }
                        childrenList.push(obj)
                    }
                }
            }
        })
    }
    //路由去重
    // let arr: any[] = childrenList
    // let hash = {};
    // const newArr = arr.reduce((item, next) => {
    //     hash[next.path] ? '' : hash[next.path] = true && item.push(next);
    //     return item
    // }, []);
    return list = childrenList

}

注:使用import.meta.glob动态添加vue页面
const modules = import.meta.glob('../view/**/**.vue');

一切准备就绪之后开始使用,本次使用的是动态路由和静态路由的组合
静态路由有如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
创建一个可以被 Vue 应用程序使用的路由实例
在这里插入图片描述
导航守卫和动态路由的添加

import { getToken } from "@/utils/auth";
import { configure, start, done } from 'nprogress'
import store from '@/store/index'
import routers from "@/router";
import { routerPackag } from "@/router/router";
import * as Types from '@/store/modules/types'
import { RouteRecordRaw } from 'vue-router';
routers.beforeEach(async (to, from, next) => {
    start()
    if (getToken()) {
        if (to.path !== '/login') {
            let userAll = JSON.parse(JSON.stringify(store.getters.userAll))
            let list: any
            if (userAll.length === 0) {
                store.dispatch(Types.USER_ALL)
                let menuLsit: any[] = []
                await store.dispatch(Types.TOP_MENU_LIST)
                await store.dispatch(Types.MENU_LIST).then(res => {
                    menuLsit = res
                    store.commit(Types.MENU_LIST, menuLsit)
                    if (menuLsit.length > 0) {
                        list = routerPackag()
                        list.map((r: RouteRecordRaw) => {
                            routers.addRoute("main", r)
                        })

                        next({ ...to, replace: true })
                    }
                })

            } else {
                next()

            }
        }
    } else {
        if (to.path === '/login') {
            next()
        } else {
            next({ path: '/login' });
        }
    }
})
routers.afterEach(() => {
    done();//结束加载动画
})

addRoute
4.0的使用在这里插入图片描述

addRoute和addRoutes的区别

addRoutes传入数组
addRoute传入单个

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值