位置: IT常识 - 正文

Vite4 + Vue3 + vue-router4 动态路由

编辑:rootadmin
Vite4 + Vue3 + vue-router4 动态路由

推荐整理分享Vite4 + Vue3 + vue-router4 动态路由,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

动态路由,基本上每一个项目都能接触到这个东西,通俗一点就是我们的菜单是根据后端接口返回的数据进行动态生成的。表面上是对菜单的一个展现处理,其实内部就是对router的一个数据处理。当然你只对菜单做处理也是可以的,但是没有任何意义,熟悉router的小伙伴都知道,如果你的一个路由存在,即使没有这个菜单,我只要改变浏览器的地址一样能访问到。所以你还是省不了修改router的步骤。通过接口获取数据的话就可以根据角色权限或者一些业务上的需求,根据不同属性实现路由的划分。达到不同的页面渲染效果。

本文只是讲解菜单的权限控制,不到按钮级别。其实按钮也是差不多的。可以设置一个属性表示菜单,一个属性表示按钮,每一个菜单的叶子节点上都包含根据权限返回的按钮数组。接着可以通过组件的形式去输出相应的按钮就可以。

一、搭建项目 😛😛😛

这里我已经提前搭建好了 Vite4+Pinia2+vue-router4+ElmentPlus搭建Vue3项目(组件、图标等按需引入)

二、根据上面链接搭建好项目,修改src/router/index.ts 😁 😉Vite4 + Vue3 + vue-router4 动态路由

asyncRoutes里面可以存放默认的一些路由,比如登录、404、403这些。由于我只是演示,所以就啥都不放了。清晰明朗一点。

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'export const asyncRoutes: RouteRecordRaw[] = []const router = createRouter({ history: createWebHashHistory(), routes: asyncRoutes, scrollBehavior: () => ({ left: 0, top: 0 })})export default router三、创建 'src/layout/index.vue' 文件 😁 😉

这个文件就是整个项目的布局,一般我们常见的项目都分为上下结构,就如下图。导航和菜单部分基本上是用户登录以后就已经确定好了,点击菜单的时候去切换路由。我这里由于这部分不是重点,所以我就很潦草的画了一个很简单的页面。

<template> <div style="padding: 100px;"> <div> <div v-for="(item, index) in menus[0].children" :key="index" style="margin-bottom: 20px;"> <router-link :to="item.path">{{item.title}}</router-link> </div> </div> <div> <router-view #default="{route, Component}"> <transition leave-from-class="ts-web-fade--leave-to" enter-active-class="animate__animated animate__bounceInRight"> <component :is="Component"></component> </transition> </router-view> </div> </div></template><script lang="ts">import appStore from '@/pinia';export default defineComponent({ setup() { const { menus } = appStore.permissionModule console.log(menus, 'menus') return { menus, } }})</script>四、创建 'src/pinia/modules/permission.ts' 文件 😁 😉

由于我这里是一个demo,没有真正的去接入后端。所以我暂时放入的静态数据。自己替换成接口返回就好。

import { defineStore } from 'pinia';import router from '@/router'// 这是整个项目的布局页面。根据自己的项目替换就好import Layout from "@/layout/index.vue";import {RouteRecordRaw} from "vue-router";export type MenuType = { path: string, title: string, component: string, redirect?: string, children?: Array<MenuType>}type RouterType = RouteRecordRaw & { hidden?: boolean; alwaysShow?: boolean;}export interface IPermissionState { routes: RouterType[] dynamicRoutes: RouterType[] menus: Array<MenuType>}function hasPermission<T>(roles: T[], route: RouterType) { if (route.meta && route.meta.roles) { return roles.some((role) => (route.meta?.roles as T[]).includes(role)); } return true}const modules = import.meta.glob('../../views/**/*.vue')const _import = (path: string) => () => import(`../../views/${path}.vue`)const assembleRouter = (routers: any) => { const addRouter = routers.filter((router: any) => { (router.title && router.icon) && (router.meta = { title: router.title, // icon: router.icon, // alwaysShow: router.alwaysShow || false, // affix: router.affix || false, }) if (router.component === 'Layout') { router.component = shallowRef(Layout) } else { if (import.meta.env.MODE === 'development') { router.component = _import(router.component) } else { router.component = modules[`../../views/${router.component}.vue`] } } if (router.children && router.children.length) { router.children = assembleRouter(router.children) } return true }) return addRouter}export function filterAsyncRoutes(routes: RouterType[], roles: string[]) { const res: RouterType[] = [] routes.forEach((route) => { const tmp = { ...route } if (hasPermission<string>(roles, tmp)) { if (tmp.children) { tmp.children = filterAsyncRoutes(tmp.children, roles) } res.push(tmp) } }) return res}export const permissionModule = defineStore({ id: 'permission', state(): IPermissionState{ return { routes: [], dynamicRoutes: [], menus: [] } }, actions:{ async getMenus() { try { // 这里由于不方便演示,所以我写的静态数据。换着自己对于的接口就好 const list:MenuType[] = [ { path: '/', title: 'ts-super-web', component: 'Layout', redirect: '/home', children: [ { title: 'home', path: 'home', component: 'home' }, { title: 'home1', path: 'home1', component: 'home1' } ] } ] this.menus = list // 组件路由 let addRouter = assembleRouter(this.menus) // addRouter = assembleRouterDelete(addRouter) // 动态添加菜单 addRouter.forEach((ts: any) => { router.addRoute(ts) }) } catch (err) { return Promise.reject(err); } } }})五、路由拦截器 😁 😉 😜

因为上面说到我没有真正的接入后端,所以这里我也没有进行token判断。自行增加一下就好,比较简单。除了token还可以在拦截器里面放置一个白名单列表,对于白名单里面的路由我们不做拦截。比如login登录页面、404等等。根据自己需求配置就好。

import router from '@/router'// @ts-ignoreimport NProgress from 'nprogress'import 'nprogress/nprogress.css'import appStore from "@/pinia";NProgress.configure({ easing: 'ease', // 动画方式 showSpinner: true, // 是否显示加载ico trickleSpeed: 200, // 自动递增间隔 minimum: 0.4, // 更改启动时使用的最小百分比})router.beforeEach(async (to, form, next) => { // 这里处理自己的逻辑,比如需要登录以后才能访问其他页面等等 NProgress.start() const { menus, getMenus } = appStore.permissionModule if (menus.length === 0) { try { // 调用接口获取菜单 进行跳转 await getMenus() next({ ...to, replace: true }) } catch (err) { next() } } else { next() } NProgress.done()})六、修改app.vue<template> <router-view /></template><style>html,body,#app { height: 100%; width: 100%; margin: 0; padding: 0;}</style>七、src/views下的两个home文件进行一下修改

home 这两个文件不修改也不影响。

<template> <p style="font-size: 32px;">你好,我是home</p></template>

home1 这两个文件不修改也不影响。

<template> <p style="font-size: 32px;">你好,我是home1</p></template>八、效果浏览

我是Etc.End。如果文章对你有所帮助,能否帮我点个免费的赞和收藏😍。

👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
本文链接地址:https://www.jiuchutong.com/zhishi/298708.html 转载请保留说明!

上一篇:云化Web IDE,在线开发新模式(it云化)

下一篇:React基础-JSX语法列表渲染详解(react js 教程)

  • 小米手表如何开启微信通知(小米手表如何开启nfc)

    小米手表如何开启微信通知(小米手表如何开启nfc)

  • i7 4500u什么水平(i7 4500y)

    i7 4500u什么水平(i7 4500y)

  • 主板cpu和dram故障灯亮(主板的cpu和dram故障灯交替亮)

    主板cpu和dram故障灯亮(主板的cpu和dram故障灯交替亮)

  • 什么的出现使制造面向个人用户的微型计算机成为可能(什么的出现以及什么的发展)

    什么的出现使制造面向个人用户的微型计算机成为可能(什么的出现以及什么的发展)

  • 移动王卡看腾讯视频不免流(移动王卡看腾讯视频为什么没有免流播放?)

    移动王卡看腾讯视频不免流(移动王卡看腾讯视频为什么没有免流播放?)

  • 脉圈怎么实名认证(脉圈怎么赚钱)

    脉圈怎么实名认证(脉圈怎么赚钱)

  • 为什么苹果手机会突然充不进电(为什么苹果手机连不上wifi)

    为什么苹果手机会突然充不进电(为什么苹果手机连不上wifi)

  • 锂电池3c和5c代表什么(锂电池3a和5a区别)

    锂电池3c和5c代表什么(锂电池3a和5a区别)

  • vivoy3怎么设置深色模式(vivoy3手机怎么开启深色模式)

    vivoy3怎么设置深色模式(vivoy3手机怎么开启深色模式)

  • 网速的基本单位(网络的网速单位)

    网速的基本单位(网络的网速单位)

  • 钉钉视频通话要钱吗

    钉钉视频通话要钱吗

  • 苹果6p截图怎么截屏(苹果6p截图怎么截图几种方法)

    苹果6p截图怎么截屏(苹果6p截图怎么截图几种方法)

  • 苹果x左侧一厘米失灵(苹果x左侧边缘触屏失灵)

    苹果x左侧一厘米失灵(苹果x左侧边缘触屏失灵)

  • qq怎么去掉精选照片(如何去除qq精选)

    qq怎么去掉精选照片(如何去除qq精选)

  • 以pdf形式发送是什么意思(以pdf形式发送是啥意思)

    以pdf形式发送是什么意思(以pdf形式发送是啥意思)

  • 华为mya al10什么型号(华为 mla al10)

    华为mya al10什么型号(华为 mla al10)

  • 文字竖排版时数字怎么写(文字竖版排列)

    文字竖排版时数字怎么写(文字竖版排列)

  • 蓝牙耳机开机键在哪(pro6蓝牙耳机开机键)

    蓝牙耳机开机键在哪(pro6蓝牙耳机开机键)

  • 华为stfal10什么型号(stf_al10华为什么型号)

    华为stfal10什么型号(stf_al10华为什么型号)

  • 货拉拉退押金多久能到账(货拉拉退押金多久才能重新加入)

    货拉拉退押金多久能到账(货拉拉退押金多久才能重新加入)

  • 手机qq视频怎么瘦脸(手机qq视频怎么录屏不让对方知道)

    手机qq视频怎么瘦脸(手机qq视频怎么录屏不让对方知道)

  • 抖音小黄车怎么开通(抖音小黄车怎么挂自己的产品卖货)

    抖音小黄车怎么开通(抖音小黄车怎么挂自己的产品卖货)

  • 全民k歌能隐藏粉丝吗(全民k歌能隐藏vip图标)

    全民k歌能隐藏粉丝吗(全民k歌能隐藏vip图标)

  • 电脑屏幕上的图标怎么变大了(电脑屏幕上的图标怎么随意放置)

    电脑屏幕上的图标怎么变大了(电脑屏幕上的图标怎么随意放置)

  • 关闭当前窗口快捷键(关闭当前窗口快捷键alt加什么)

    关闭当前窗口快捷键(关闭当前窗口快捷键alt加什么)

  • 深度学习——VGG16模型详解

    深度学习——VGG16模型详解

  • Hovenweep国家纪念碑的方塔,犹他州 (© Brad McGinley Photography/Getty Images)(国家纪念品)

    Hovenweep国家纪念碑的方塔,犹他州 (© Brad McGinley Photography/Getty Images)(国家纪念品)

  • dedecms调用当前位置标签方法集合(dedecms 授权)

    dedecms调用当前位置标签方法集合(dedecms 授权)

  • 贸易公司开发票进项跟销项不符合怎么办
  • 食堂费用没有发票可以税前扣除吗
  • 小微企业和小规模纳税人的区别
  • 季报利润表本期金额怎么计算
  • 企业外部风险包括
  • 房地产公司转让土地
  • 成品油增值税抵减政策
  • 社保利息是什么意思
  • 个人转让住宅要交哪些税
  • 海关证需要年检吗
  • 出借包装物收取的押金属于什么
  • 出纳长短款项应按日结清,但不需要计算
  • 已过认证周期什么意思
  • 其他业务成本是什么类
  • 7.1发票没有税号怎么开
  • 增值税税负率计算器
  • 资管产品征税
  • 天猫店不开发票会被扣多少分
  • 实收资本印花税最新规定
  • 原始凭证的基本内容包括会计科目吗
  • 我的初级备考经验--相信自己
  • 汽车行业销售折让
  • 现金预算在企业财务管理中是何地位
  • 网上申报附加税怎么报
  • 收据大写后面的数字
  • scanexplicit.exe - scanexplicit是什么进程 作用是什么
  • win10右键没有新建excel和word
  • 员工冲借款应该怎么做账
  • 逾期增值税扣税凭证
  • 工业企业采购部门职责
  • yolov2训练
  • 公司投资款无法收回
  • 什么情况需要缴纳增值税
  • 电子承兑汇票支付流程
  • Yii2超好用的日期和时间组件(值得收藏)
  • 中途建账期初数据哪里来的
  • chatgpt的多种免费使用方式
  • 尚融资本
  • 基于车联网
  • vue如何使用axios
  • ips attack
  • fold命令 限制文件列宽
  • 广告系统源码
  • c语言二级指针详解
  • 资产减值损失为什么要调增
  • ps里的钢笔工具
  • 火车头造型
  • 小规模小于30万之前计提的税金及附加税
  • 教育类财务工作内容
  • 工资是当月计提当月发放还是当月计提下月发放
  • SQLServer2005 XML数据操作代码
  • 留抵进项税太多怎么办
  • 收到增值税发票月饼
  • 成本核算方法是资源到作业,作业到产品吗?
  • 购买农产品普通发票怎么做账
  • 车辆抵押贷款影响以后卖车吗
  • 委托加工应税消费品纳税义务发生时间
  • 办公费项目内容
  • 以前年度损益调整属于哪类科目
  • 残保金什么时候截止
  • 采用补偿贸易方式的是
  • php的每条语句以什么结尾
  • mysql输入密码命令
  • 阿里云linux 服务器 字符集
  • 如何使用命令查找电脑IP地址
  • Windows Server 2008之数据安全保护
  • linux清屏幕命令
  • 如何使用chatgpt
  • win7系统每次开机都要选择用户
  • win7系统多久不动自动关机
  • opengl缓冲区
  • 游戏开发之二维码怎么弄
  • opengles入门
  • linux随机数生成1到100
  • 网站检测系统
  • django实时刷新日志前端
  • koa和express的区别
  • js对象判断
  • 税务局全年绩效分析报告
  • 省纪检委派驻机构值得去么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设