下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Vue3+Vite实现动态路由的详细实例代码项目基本目录
1.首先定义初始默认的路由routes(router.js文件),vue文件使用import引入可以按需加载
import{
createRouter,
createWebHashHistory
}from"vue-router";
importstorefrom'../store/index.js'
constroutes=[{
path:"/login",
component:()=import("../view/Login/index.vue"),
children:[],
meta:{
title:'登录页',
hideMenu:true,//加入hideMenu属性,不展示在侧边栏
name:"Login",
path:"/",
component:()=import("../view/Home/index.vue"),
meta:{
keepalive:true,
title:"主页",
name:'Home',
//hideMenu:true,//不展示在侧边栏
children:[],
redirect:'/index'
]
2.在store的login.js模块写入调用后端数据的函数(写在vuex的action对象中,方便全局异步调用)
Vuex允许我们将store分割成模块(module),比如登录模块,项目各个业务不相关的模块。每个模块拥有自己的state、mutation、action、getter、甚至是嵌套子模块(具体可以看主页另一篇博客)
3.执行addRoutes函数获取动态路由(在router.js文件,点击登录成功后,在全局路由守卫去判断是否登录成功,再调用addRoutes函数)
(1)全局路由守卫逻辑具体可看注释,好处是进入项目之后,刷新页面路由守卫会拦截跳转,可以重新执行addRoutes()获取路由,先获取动态路由,再执行跳转,不然页面会报本地路由找不到(一个小坑)
(代码如下)
router.beforeEach(async(to,from,next)={//路由守卫
if(store.state.login.token){//存在token
if(to.path=='/login'){//存在token,如果想跳转到登录页,默认有token跳转进项目首页
next({
path:'/'
}else{
//如果存在token,跳转进项目页面,则判断当前后端返回的路由有无长度
//或者有无即将跳转路由的name
if(store.getters['login/getRoutes'].length||!=null){
next()//有的话直接跳转
}else{//不满足条件的话,重新请求后端动态路由数据
awaitaddRoutes();//addRoutes()必须加入await!!!!等待逻辑执行完毕获取路由
//如果addRoute未完成,路由守卫会一层一层的执行执行,不加next()可能导致卡死!
//直到addRoute完成,找到对应的路由
next({
...to,
replace:true
}else{
if(to.path=='/login'){
next()
}else{
next('/login')
})
后端返回的格式
(2)(重点在这,前面的步骤都可以不是重点)Vite使用import.meta.glob动态导入view文件夹所有前端页面,并调用addRoutes()函数执行获取动态路由数据并做处理(代码如下),主要作用是替换掉后端返回的component格式,再addRoute进路由表(看不懂的可以看代码注释或者可以搬进自己的项目打印看看每一步获取的数据)
letasyncRoutes=[]//定义数组接收后端返回的路由
constrouteAllPathToCompMap=import.meta.glob(`../view/**/*.vue`);
//**为通配符,vite不支持require导入方式,故用import.meta.glob(vite动态导入)
/*import.meta.glob
*该方法匹配到的文件默认是懒加载,通过动态导入实现,构建时会分离独立的chunk,是异步导入,返回的是Promise
*/*import.meta.globEager
*该方法是直接导入所有模块,并且是同步导入,返回结果直接通过for...in循环就可以操作
asyncfunctionaddRoutes(){
awaitstore.dispatch('login/getNewRoutes').then((res)={//获取后端返回的动态路由
if(res.datares.data.length){
//lethomeRouteChildren=[];
asyncRoutes=res.data;
*1。拿到处理完毕home的children,最终替换掉原来的children,给菜单渲染提供支持
*2.通过递归,调用router.addRoute,把每一项route插到对应的父route下
//服务端配置了路由,但前端还没添加对应文件的路由列表,内容是路由的component值(服务端的)
//constunForList=['']
consthomeChildren=routes[1].children;
constdfs=(parentRouteName='Home',asyncRoutes=[],originRouteChildren=[])={
if(!Array.isArray(asyncRoutes))return[];
asyncRoutes.forEach(route={
//if(unForList.includes(ponent))return;
/**后端返回来的路由component是字符串,如component:"view/Index/index.vue",
*前端需要把component:"view/Index/index.vue"转化为组件对象
*component:()=import("/src/view/Index/index.vue")
ponent=routeAllPathToCompMap[`../${ponent}`];
//ponent=()=import(`../${ponent}`);
constrouteChildren=route.children;
router.addRoute(parentRouteName,route);
route.children=dfs(,routeChildren)
originRouteChildren.push(rout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026人工智能芯片设计与制造技术创新方向
- 2026中国室内装饰行业市场需求技术创新市场分析报告
- 2026云平台使用面试题及答案
- 2026-2030火锅行业市场深度调研及发展趋势与投资战略研究报告
- 2026浙江选调面试题及答案
- 教资考试2024年下半年中小学教师资格考试综合素质试题(中学)
- 毕业生实习报告范文2000字
- 2026-2030中国大豆用农药市场发展动态分析及竞争战略规划研究报告
- 对项目管理人员安全技术交底2
- 深圳北站交通枢纽招标文件-信息化集成系统:招标附图清单
- (2026秋新版)北师大版六年级数学上册全册教案
- 部队卫生员试题及答案
- JG/T 347-2012聚碳酸酯(PC)实心板
- DBJ50-T-306-2024 建设工程档案编制验收标准
- 2024年学校安全事故典型案例
- 第二届晋中市职业技能大赛技术文件-钳工项目
- JJF 1375-2024机动车发动机转速测量仪校准规范
- GB/T 9799-2024金属及其他无机覆盖层钢铁上经过处理的锌电镀层
- 临床药物治疗学白血病
- 数字电子技术(第五版)课件 8.2 数模及模数转换电路-ADC
- 躁动患者护理查房的
评论
0/150
提交评论