文章目录

  • 项目创建
    • 创建项目
    • 运行项目
    • 整理目录
      • 删除src/assets中的所有logo.png
      • 删除src/components中的所有文件
      • 修改src/route/index.js
      • 删除src/views中所有文件
      • 修改src/app.vue
      • 整理完目录如下
  • 引入ElementUI
    • 安装ElementUI
    • 引入ElementUI
    • 测试是否安装成功
      • 编写src/app.vue
      • 运行结果
  • 编写路由搭架子
    • 一级路由
      • 新建src/views/Login.vue
      • 新建src/views/front/frontIndex.vue
      • 新建src/views/admin/adminIndex.vue
    • 二级路由
      • 新建src/views/front/home.vue
      • 新建src/views/front/caricature.vue
      • 新建src/views/admin/user.vue
      • 新建src/views/admin/provider.vue
    • 修改src/router/index.js
    • 修改app.vue
    • 运行结果
  • 使用 ElementUI 中菜单组件
    • 修改src/views/front/frontIndex.vue
    • 修改src/views/admin/adminIndex.vue
    • 运行结果
  • 高级用法
    • 1 ElementUI 菜单的默认路由机制​
    • 2 与 router-link模糊匹配的区别​
    • 3. 实现模糊匹配的解决方案​
      • 方案一:自定义计算属性动态匹配​
      • 方案二:扩展 el-menu的 default-active逻辑​
      • 方案三:递归处理嵌套菜单​
    • 4 总结​​

项目创建

创建项目

我的node.js使用的是20.18.0版本
我的 @vue/cli使用的是5.0.8版本

新建空白文件夹输入cmd打开命令行窗口
在这里插入图片描述

执行如下指令

vue create elementui-draw-pages

勾选如下选项
在这里插入图片描述

运行项目

npm run serve

在这里插入图片描述
运行结果
在这里插入图片描述

整理目录

删除src/assets中的所有logo.png

删除src/components中的所有文件

修改src/route/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const routes = []const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})export default router

删除src/views中所有文件

修改src/app.vue

<template><div id="app">初始化页面</div>
</template><style lang="scss"></style>

整理完目录如下

在这里插入图片描述

引入ElementUI

安装ElementUI

可以参考我之前的博客Vue2使用cli脚手架引入ElementUI

我直接全局安装了

npm i element-ui -S

引入ElementUI

在 main.js 中写入以下内容:

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';Vue.use(ElementUI);new Vue({el: '#app',render: h => h(App)
});

测试是否安装成功

编写src/app.vue

<template><div id="app"><el-button type="primary">测试</el-button></div>
</template><script>export default {
}
</script><style lang="scss">
</style>

运行结果

在这里插入图片描述

编写路由搭架子

一级路由

新建src/views/Login.vue

<template><div><h1>一级路由 Login</h1></div>
</template><script>
export default {}
</script><style></style>

新建src/views/front/frontIndex.vue

<template><div><h1> 一级路由 前台</h1><router-view></router-view></div>
</template><script>
export default {}
</script><style></style>

新建src/views/admin/adminIndex.vue

<template><div><h1>一级路由 后台</h1><router-view></router-view></div>
</template><script>
export default {};
</script><style lang="scss" scope>
</style>

二级路由

新建src/views/front/home.vue

<template><div><h2>二级路由Home</h2></div>
</template><script>
export default {}
</script><style></style>

新建src/views/front/caricature.vue

<template><div><h2>二级路由漫画</h2></div>
</template><script>
export default {}
</script><style></style>

新建src/views/admin/user.vue

<template><div><h2>二级路由 用户管理</h2></div>
</template><script>
export default {}
</script><style></style>

新建src/views/admin/provider.vue

<template><div><h2>二级路由Provider</h2></div>
</template><script>
export default {}
</script><style></style>

修改src/router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const routes = [// 重定向{path: '/', redirect: '/login'},{path: '/login', component: () => import('@/views/Login.vue')},{path: '/admin', component: () => import('@/views/admin/adminIndex.vue'),redirect: '/admin/user', // 重定向两种写法 推荐这种写法简单children:[{path: 'user', component: () => import('@/views/admin/user.vue')},{path: 'provider', component: () => import('@/views/admin/provider.vue')},]},{path: '/front', component: () => import('@/views/front/frontIndex.vue'),children:[{path: '/front', redirect: '/front/home'},// 重定向两种写法{path: '/front/home', component: () => import('@/views/front/home.vue')},{path: '/front/caricature', component: () => import('@/views/front/caricature.vue')}]}
]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})export default router

修改app.vue

<template><div id="app"><router-view></router-view></div>
</template><script>export default {}
</script><style lang="scss"></style>

运行结果

在这里插入图片描述

使用 ElementUI 中菜单组件

修改src/views/front/frontIndex.vue

<template><div><!-- <h1> 一级路由 前台</h1><router-view></router-view> --><el-container><el-header><!--router: 是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转--><!-- 这里 default-active 需要默认选中这里的default-active为什么不能写死呢?即 default-active="/front/home"因为路由是动态的,所以需要根据路由来动态设置如果写成上面的,那么路由切换的时候,菜单栏不会跟着切换。即出现  在http://localhost:8080/front/home页面已刷新,默认选中变成了首页,但是还是展示漫画页面--><!-- mode: 模式,默认值 vertical(垂直展示) ,可选值 horizontal(水平展示)--><!-- background-color: 菜单栏背景色text-color: 菜单栏文字颜色active-text-color: 菜单栏激活的文字颜色--><el-menurouter:default-active="$route.path"class="el-menu-demo"mode="horizontal"background-color="#545c64"text-color="#fff"active-text-color="#ffd04b"><el-menu-item index="/front/home">首页</el-menu-item><el-menu-item index="/front/caricature">漫画</el-menu-item></el-menu></el-header><el-main><router-view></router-view></el-main></el-container></div>
</template><script>
export default {};
</script><style lang="scss" scoped>
.el-header{margin: 0;padding: 0;
}
</style>

修改src/views/admin/adminIndex.vue

<template><div><!-- <h1>一级路由 后台</h1><router-view></router-view> --><el-container><el-header class="el-header-admin"> 后台管理 </el-header><el-container><el-aside width="200px"><!--router: 是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转--><!-- 这里 default-active 需要默认选中这里的default-active为什么不能写死呢?即 default-active="/admin/user"因为路由是动态的,所以需要根据路由来动态设置如果写成上面的,那么路由切换的时候,菜单栏不会跟着切换。即出现  在http://localhost:8080/admin/provider页面已刷新,默认选中变成了用户管理,但是还是展示供应商管理页面--><!-- mode: 模式,默认值 vertical(垂直展示) ,可选值 horizontal(水平展示)--><!-- background-color: 菜单栏背景色text-color: 菜单栏文字颜色active-text-color: 菜单栏激活的文字颜色--><el-menurouter:default-active="$route.path"class="el-menu-demo"mode="vertical"background-color="#545c64"text-color="#fff"active-text-color="#ffd04b"><el-menu-item index="/admin/user">用户管理</el-menu-item><el-menu-item index="/admin/provider">供应商管理</el-menu-item></el-menu></el-aside><el-main><router-view></router-view></el-main></el-container></el-container></div>
</template><script>
export default {};
</script><style lang="scss" scope>
* {margin: 0;padding: 0;
}
.el-header-admin {background-color: #545c64;font-size: 30px;color: #fff;line-height: 60px;
}
.el-menu-demo {height: 90vh;
}
</style>

运行结果

在这里插入图片描述

高级用法

ElementUI 的菜单组件(el-menu)默认的​​路由匹配行为是精确匹配​​,而非 router-link的模糊匹配(即包含匹配)。不过,可以通过自定义逻辑模拟类似效果。以下是具体分析及实现方案:

1 ElementUI 菜单的默认路由机制​

  • 路由跳转​​
    在 el-menu上设置 :router="true"后,点击 el-menu-item时会将其 index属性作为路径跳转(等价于 $router.push(index))。
  • ​​激活状态匹配​​
    default-active属性需绑定当前路由路径(如 :default-active=“$route.path”),但​​仅支持精确匹配​​:只有当前路径与 index完全一致时,菜单项才会高亮。

2 与 router-link模糊匹配的区别​

特性​router-link(默认)ElementUI 菜单(默认)
匹配模式​​模糊匹配(路径包含即激活)精确匹配(路径完全一致才激活)
​​配置方式​​无需额外配置需手动绑定 default-active
​​子路径激活​​支持(如 /user激活 /user/list)❌ 不支持

3. 实现模糊匹配的解决方案​

方案一:自定义计算属性动态匹配​

通过监听路由变化,手动检查当前路径是否包含菜单项的 index值:

<template><el-menu :default-active="activeMenu"><el-menu-item index="/user" @click="$router.push('/user')">用户管理</el-menu-item></el-menu>
</template><script>
export default {computed: {activeMenu() {const route = this.$route.path;// 模糊匹配逻辑:若当前路径包含菜单项的 index,则激活该菜单if (route.includes('/user')) return '/user';return route;}}
};
</script>

优点​​:灵活控制匹配规则,支持多级路径。

方案二:扩展 el-menu的 default-active逻辑​

封装高阶组件,重写 default-active的匹配逻辑:

Vue.component('fuzzy-menu', {props: ['menus'],computed: {activePath() {return this.menus.find(menu => this.$route.path.includes(menu.index))?.index;}},render(h) {return h('el-menu', {props: { defaultActive: this.activePath }}, this.menus.map(menu => h('el-menu-item', { props: { index: menu.index } }, menu.label)));}
});

适用场景​​:需多处复用模糊匹配菜单时。

方案三:递归处理嵌套菜单​

对于多级菜单(el-submenu),递归遍历子节点检查路径:

function findActiveMenu(menus, path) {for (const menu of menus) {if (path.includes(menu.index)) return menu.index;if (menu.children) {const childActive = findActiveMenu(menu.children, path);if (childActive) return childActive;}}
}

适用场景​​:动态生成复杂树形菜单时。

4 总结​​

  • ​​默认行为​​:ElementUI 菜单仅支持精确路由匹配,无法直接实现 router-link的模糊匹配。

  • ​​自定义方案​​:

    • 通过计算属性动态绑定 activeMenu✅

    • 封装高阶组件扩展匹配逻辑 ✅

    • 递归处理多级菜单路径 ✅

  • ​​推荐场景​​:

    • 简单项目 → ​​方案一​​(计算属性)

    • 复杂系统 → ​​方案二/三​​(组件封装或递归)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94680.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94680.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94680.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python训练营打卡Day44-通道注意力(SE注意力)

知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力后的特征图和热力图 内…

shiro进行解密

目录Shiro 解密的核心注意事项1. 密码处理&#xff1a;坚决避免 “可逆解密”2.例子【自己模拟数据库&#xff0c;未连数据库】:Shiro 解密的核心注意事项 1. 密码处理&#xff1a;坚决避免 “可逆解密” 禁用明文存储:永远不要将明文密码存入数据库&#xff0c;必须使用 Has…

更改 Microsoft Edge 浏览器的缓存与用户数据目录位置

Microsoft Edge浏览器默认会将缓存文件和用户数据存储在系统盘&#xff08;通常是C盘&#xff09;&#xff0c;随着使用时间的增长&#xff0c;这些文件可能会占用大量空间。本文将详细介绍多种更改Edge浏览器缓存位置和用户数据目录位置的方法&#xff0c;帮助您更好地管理磁盘…

【传奇开心果系列】Flet框架实现的图形化界面的PDF转word转换器办公小工具自定义模板

let框架实现的图形化界面的PDF转word转换器办公小工具自定义模板一、效果展示截图二、PDF转Word转换器概括介绍三、功能特性四、安装依赖五、运行程序六、使用说明七、注意事项八、技术栈九、系统要求十、源码下载地址 一、效果展示截图二、PDF转Word转换器概括介绍 一个基于Fl…

STM32 定时器(PWM输入捕获)

以下是基于STM32标准库&#xff08;以STM32F103为例&#xff09;实现PWM输入模式&#xff08;自动双沿捕获&#xff09;的完整代码&#xff0c;通过配置定时器的PWM输入模式&#xff0c;可自动捕获外部PWM信号的周期&#xff08;频率&#xff09;​和占空比&#xff0c;无需手动…

Web安全开发指导规范文档V1.0

一、背景 团队最近频繁遭受网络攻击,引起了部门技术负责人的重视,笔者在团队中相对来说更懂安全,因此花了点时间编辑了一份安全开发自检清单,觉得应该也有不少读者有需要,所以将其分享出来。 二、编码安全 2.1 输入验证 说明 检查项 概述 任何来自客户端的数据,如URL和…

在Godot中为您的游戏添加并控制游戏角色的完整技术指南

这是一个在Godot中为您的游戏添加并控制玩家角色的完整技术指南。这个过程分为三大步&#xff1a;​准备资源、构建场景、编写控制脚本。道可道&#xff0c;非常道&#xff0c;名可名&#xff0c;非常名&#xff01;第一步&#xff1a;准备资源&#xff08;建模与动画&#xff…

Flink 状态 RocksDBListState(写入时的Merge优化)

RocksDBListState<K, N, V> RocksDBListState 继承自 AbstractRocksDBState<K, N, List<V>>&#xff0c;并实现了 InternalListState<K, N, V> 接口。继承 AbstractRocksDBState: 这意味着它天然获得了与 RocksDB 交互的底层能力&#xff0c;包括&…

zookeeper-保姆级配置说明

一. 基本配置&#xff1a;clientPort&#xff1a; 客户端连接的服务器所监听的tcp端口&#xff0c;默认2181dataDir&#xff1a;内存数据库保存的数据路径。myid也存放在这个目录下&#xff0c;数据以异步方式写入。dataLogDir&#xff1a;事务日志存放路径。服务在确认一个事务…

半小时打造七夕传统文化网站:Qoder AI编程实战记录

背景 最近七夕到了&#xff0c;恰逢Qoder上线&#xff0c;萌生了一个想法&#xff0c;写一个以中国传统七夕为主题的网站。 七夕中国传统情人节 Qoder 介绍 Qoder 是阿里巴巴推出的一款旨在提升开发效率的 AI 编程平台。它通过上下文工程技术和智能体辅助&#xff0c;帮助开…

常见的 Loader 和 Plugin?

Loader: babel-loader&#xff1a;将ES6的代码转换成ES5的代码。css-loader&#xff1a;解析CSS文件&#xff0c;并处理CSS中的依赖关系。style-loader&#xff1a;将CSS代码注入到HTML文档中。file-loader&#xff1a;解析文件路径&#xff0c;将文件赋值到输出目录&#xff0…

设计模式学习笔记-----抽象策略模式

抽象策略模式由五个核心组件组成策略接口定义所有策略的统一规范&#xff0c;是策略模式的 "契约"mark()&#xff1a;策略的唯一标识&#xff08;类似字典的 key&#xff09;&#xff0c;默认返回 null&#xff0c;需具体策略实现类重写&#xff08;如InterviewSubje…

RabbitMQ面试精讲 Day 30:RabbitMQ面试真题解析与答题技巧

【RabbitMQ面试精讲 Day 30】RabbitMQ面试真题解析与答题技巧 开篇&#xff1a;系列收官之作&#xff0c;直击面试核心 今天是“RabbitMQ面试精讲”系列的第30天&#xff0c;也是本系列的收官之作。经过前29天对RabbitMQ核心概念、高级特性、集群架构、性能调优与开发运维的系…

Coze Studio开源版:AI Agent开发平台的深度技术解析- 入门篇

Coze Studio开源版&#xff1a;AI Agent开发平台的深度技术解析 引言 在人工智能快速发展的今天&#xff0c;AI Agent&#xff08;智能体&#xff09;已成为连接大语言模型与实际应用场景的重要桥梁。然而&#xff0c;构建一个功能完整、性能稳定的AI Agent开发平台并非易事&am…

一文了解 DeepSeek 系列模型的演进与创新

近年来&#xff0c;DeepSeek 团队在大语言模型&#xff08;LLM&#xff09;领域持续发力&#xff0c;围绕模型架构、专家路由、推理效率、训练方法等方面不断优化&#xff0c;推出了一系列性能强劲的开源模型。本文对 DeepSeek 系列的关键论文进行了梳理&#xff0c;帮助大家快…

开源大模型本地部署

一、大模型 T5\BERT\GPT → Transformer的儿子→自注意力机制神经网络 大模型&#xff0c; Large Model&#xff0c;是指参数规模庞大、训练数据量巨大、具有强泛化能力的人工智能模型&#xff0c;典型代表如GPT、BERT、PaLM等。它们通常基于深度神经网络&#xff0c;特别是T…

DAY 57 经典时序预测模型1

知识点回顾 序列数据的处理&#xff1a; 处理非平稳性&#xff1a;n阶差分处理季节性&#xff1a;季节性差分自回归性无需处理 模型的选择 AR(p) 自回归模型&#xff1a;当前值受到过去p个值的影响MA(q) 移动平均模型&#xff1a;当前值收到短期冲击的影响&#xff0c;且冲击影…

贪吃蛇游戏(纯HTML)

一、游戏截图二、源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>离谱贪吃蛇</title>…

InnoDB详解2

InnoDB详解2一.行结构1.结构图2.InnoDB支持的数据行格式1&#xff09;查看当前数据库或表的行格式2&#xff09;指定行格式3&#xff09;DYNAMIC 格式的组成3.数据区存储真实数据方式4.行的额外(管理)信息区5.头信息区域1&#xff09;删除一行记录时在InnoDB内部执行的操作6.Nu…

Rust系统编程实战:驾驭内存安全、无畏并发与WASM跨平台开发

简介本文深入探讨Rust在系统编程领域的核心实战应用&#xff0c;通过代码示例解析其所有权机制如何保障内存安全&#xff0c;如何利用 fearless concurrency 构建高性能并发应用&#xff0c;并实践如何将Rust代码编译为WebAssembly&#xff08;WASM&#xff09;以突破性能瓶颈。…