Vue Web开发(八)
1. VueWeb面包屑和tag的布局
本章节完成VueWeb面包屑和tag的布局,并且与左侧菜单联系,涉及组件间通信。
1.1. 页面创建
(1)首先我们先完成每个页面的路由,之前已经有home页面和user页面,缺少mail页面和其它选项下的page1和page2页面。在view文件夹下新建mail文件夹,新建index.vue,填充user页面的内容即可。在view下新建other文件夹,新建pageOne.vue和pageTwo.vue,页面内容简单填充即可。三个页面都要更改name属性,后面会用到,首字母大写。
新建src/ciews/mail/index.vue
//src/ciews/mail/index.vue
<template><div>网上商品页面</div>
</template>
<script>export default {name: 'mail',data() {return {}}}
</script>
新建src/ciews/other/pageOne.vue
//src/ciews/other/pageOne.vue
<template><div>网上PageOne页面</div>
</template>
<script>export default {name: 'PageOne',data() {return {}}}
</script>
新建src/ciews/other/pageTwo.vue
//src/ciews/other/pageTwo.vue
//User.vue文件
<template><div>网上PageTwo页面</div>
</template>
<script>export default {name: 'PageTwo',data() {return {}}}
</script>
(2)配置路由:在路由主文件添加路由,路由位置在CommonAside的menu数组中保持偶一致。这里的name属性是小写,与上面不相同。
// isCollapse: false,menu: [{id: 0,path: "/home",name: "home",label: "首页",icon: "s-home",url: "Home/Home",},{id: 1,path: "/mail",name: "mail",label: "商品管理",icon: "video-play",url: "MailManage/MailManage",},{id: 2,path: "/user",name: "user",label: "用户管理",icon: "user",url: "UserManage/UserManage",},{label: "其他",icon: "location",children: [{id: 3,path: "/page1",name: "pageOne",label: "页面1",icon: "setting",url: "Other/PageOne",},{id: 4,path: "/page2",name: "pageTwo",label: "页面2",icon: "setting",url: "Other/PageTwo",}],},]
(3)为左侧导航栏其他模块二级菜单添加点击事件。为el-menu-item添加点击事件。
<el-menu-item-group v-for="(subItem,subIndex) in item.children":key="subItem.path+''"><el-menu-item @click="clickMenu(subItem)" :index="subIndex.toString()">{{subItem.label}}</el-menu-item></el-menu-item-group>
1.2. 面包屑功能
(1)面包屑有数据记忆存储功能,每次点击导航栏后后记录选中的导航栏并列出。这里需要用到Vuex.Store,我们前面左侧导航栏的收起与展开同样使用到Vuex.Store,store可以看做是容器,里面有四个值,由State、Getters、Mutation、Actions这四种组成。在src/store下的tab.js文件,默认数据定义在state中,我们定义为一个数组tabsList,数组里有多个对象,但这里知识默认对象,对象里有四个属性,path、name、label、icon。currentMenu为一个临时变量,存储点击的tab。
// src/store/tab.jsstate: {isCollapse: false,//默认菜单面包屑tabsList: [{id: 0,path: "/home",name: "home",label: "首页",icon: "s-home",url: "Home/Home",}],//当前菜单面包屑currentMenu: null},
(2)改变tabsList里的内容要用到Vuex.store的mutations。改变state数据的发都会以函数的形式写在mutations中,之后在页面调用即可。selectMenu函数接收两个参数,state和val,此时需要进行判断,当前点击的导航栏是不是首页,用name属性判断,判断传入的item.name是否等于‘home’,如果不是home,需要赋值val给currentMenu,这样currentMenu就会不断累加,最多为五个(首页、用户、商品、其他1、其他2)。此处还需要一个判断,判断当前点击的导航栏是是不是刚刚已经点击过来,点击过了不再进行累加,而是将面包屑跳转到点击过的那一个。这里用到findIndex()方法。判断item.name里是否有val.name。 有的话为1,无的话为-1,无的话那么使用push()方法将val累加到currentMenu。如果点击是‘home’的情况,currentMenu置空。
// src/store/tab.js//更改 Vuex 的store中的状态的唯一方法是提交mutationsmutations: {collapseMenu(state) {state.isCollapse = !state.isCollapse},selectMenu(state, val) {if (val.name !== 'home') {state.currentMenu = valconst result = state.tabsList.findIndex(item => item.name === val.name)if (result === -1) {//不存在state.tabsList.push(val)}} else {state.currentMenu = null}},}
(3)在src/componentsCommonAside中调用currentMenu,并传入item,item实际就menu数组中的任一对象。
// src/componentsCommonAside.vuethis.$store.commit('selectMenu',item)
// src/componentsCommonAside.vue/*** 一级、二级菜单点击事件* @param item*/clickMenu(item) {//全局引用router跳转this.$router.push({// name: item.name //名字路由指引path:item.path//路径路由指引}).catch(e => {})this.$store.commit('selectMenu',item)},
(4)更改CommonHeader.vue,使用element ui的面包屑元素。
//element ui官方案例:Breadcrumb,面包屑
<el-breadcrumb separator="/"><el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item><el-breadcrumb-item><a href="/">活动管理</a></el-breadcrumb-item><el-breadcrumb-item>活动列表</el-breadcrumb-item><el-breadcrumb-item>活动详情</el-breadcrumb-item>
</el-breadcrumb>
我们需要进行数据渲染,渲染成动态数据,v-for循环tags,:key使用item.path识别。{{}}表示动态渲染数据。
这里数据比较比较长,item–tags–tabsList–menu。tabsList里的数据也是menu动态加载进去的。
<el-breadcrumb separator="/"><el-breadcrumb-item v-for="item in tags" :key="item.path" :to="{ path: item.path }">{{item.label}}</el-breadcrumb-item></el-breadcrumb>
(5)修改src/CommonHeader.vue
src/CommonHeader.vue引入mapState,这个是vuex的辅助函数。
// src/CommonHeader.vueimport { mapState } from 'vuex'
在computed属性中进行注入,这里起了一个别名tags。
// src/CommonHeader.vuecomputed:{//当前组件需要的全局数据,映射为当前组件computed属性//数据注入...mapState({tags:state => state.tab.tabsList})}
(6)页面会根据面包屑进行,路由也会自行更改。
VueWeb Element Ui面包屑示例下载
1.3. tag区域
这个功能其实类似于面包屑,只是多了删除功能。使用element ui的tag组件。tag组件的close属性表示组件是否可以关闭。tag组件有两个触发事件click、close。分别是点击tag和删除tag。
&emsp(1);tag组件为公共组件,在components下新建CommonTag.vue。v-for遍历tags,这里注意,首页tag是不能删除的,closable属性表示有删除按钮,后面可以附带条件。effect属性为主题(样式),表示为高亮显示。判断方法是根据路由地址和当前tag的名称是否一致,注意是route(不是router)一致则为dark(高亮),不一致为plain(白色)。添加改变tag事件和删除tag事件。这里用模块化,用函数实现。
//src/components/CommonTag.vue
<template><div class="tabs"><el-tag v-for="(tag,index) in tags" :key="tag.name" :closable="tag.name !== 'home'":effect="$route.name === tag.name ? 'dark' : 'plain'" @click="changeMenu(tag)"@close="handleClose(tag,index)" size="small">{{ tag.label }}</el-tag></div>
</template>
(2)渲染tag,同样需要用到tabsList,引入mapState,在computed属性中注入,注入为三个点(…),这里同样将tabsList赋值给tags,两个页面的tags互不干扰。
//src/components/CommonTag.vue
<script>import {mapState,mapMutations} from 'vuex'export default {name: 'CommonTag',data() {return {}},computed: {...mapState({tags: state => state.tab.tabsList}),},methods: {...mapMutations({close: 'closeTag'}),changeMenu()handleClose()},}
</script>
(3)在src/views/Main.vue引入组件
// src/views/Main.vue
import CommonTag from "../src/components/CommonTag.vue";
export default {name: "Home",components: {CommonTag},
注意在el-header和el-main之间,因为这个组件并不属于header也不属于main,所以在中间。
// src/views/Main.vue
<el-header><common-header></common-header>
</el-header>
<common-tag></common-tag>
<el-main><router-view></router-view>
</el-main>
覆盖样式
// src/views/Main.vue
<style lang="less" scoped>.tabs{padding: 20px;.el-tag{margin-right: 15px;cursor: pointer;}}
</style>
(4)接下来完成//src/components/CommonTag.vue点击事件个删除事件(重难点!!!),点击就是路由切换。methods里更改函数。
//src/components/CommonTag.vuechangeMenu(item) {this.$router.push({name: item.name})console.log(name)
},
(5)删除tag:
删除tag也会删除对应的面包屑,面包屑对应的是state.tabsList。首先拿到tag的总长度,总长度减1就是我们当前选中的tag,赋值给length,判断length和index的长度进行比较,如果这两个值相等,那么就表示此时我们选中的tag是tag中的最后一项。首先判断tag.name与当前的路由是否一致,如果不一致,不需要额外操作,直接return,即高亮 在最后一个tag,删除的tag是非选中的tag,所以无需操作。
如果当前删除的tag是最后一个tag,那么高亮部分一个向左移动一格。如果当前菜单高亮才当在中间,并且你删除当前的菜单时,高亮显示向右移动一格。
//src/components/CommonTag.vuehandleClose(tag,index){this.close(tag)const length = this.tags.length - 1if(tag.name !== this.$route.name){return;}//高亮向左移动,这里视频代码错误,应该是上面不减1,下面减1.if(index === length){this.$router.push({name: this.tags[index].name})}else{this.$router.push({name: this.tags[index - 1].name})}}
(5)此时在src/store/tab.js需要删除state下的tabsList,修改state必须使用mutations。因此需要在mutations中声明closeTag。
//src/store/tab.jscloseTag(state,val){const result = state.tabsList.findIndex(item => item.name === val.name)state.tabsList.splice(result,1)}
(6)在src/components/CommonTag.vue下调用mutations
//src/components/CommonTag.vue
import { mapState,mapMutations } from 'vuex'...mapMutations({close:'closeTag'}),
(7)在src/components/CommonTag.vue总体的script代码。
// src/components/CommonTag.vue
<script>
import { mapState,mapMutations } from 'vuex'export default{name:'CommonTag',data(){return{}},computed:{...mapState({tags:state => state.tab.tabsList}) ,},methods:{...mapMutations({close:'closeTag'}),changeMenu(item){this.$router.push({ name: item.name })console.log(name)},handleClose(tag,index){this.close(tag)const length = this.tags.length - 1if(tag.name !== this.$route.name){return;}//高亮向左移动,这里视频代码错误,应该是上面不减1,下面减1.if(index === length){this.$router.push({name: this.tags[index].name})}else{this.$router.push({name: this.tags[index - 1].name})}},}}
</script>
效果图
VueWeb Tag示例下载
相关文章:

Vue Web开发(八)
1. VueWeb面包屑和tag的布局 本章节完成VueWeb面包屑和tag的布局,并且与左侧菜单联系,涉及组件间通信。 1.1. 页面创建 (1)首先我们先完成每个页面的路由,之前已经有home页面和user页面,缺少mail页面和其…...

element-ui实现table表格的嵌套(table表格嵌套)功能实现
最近在做电商类型的官网,希望实现的布局如下:有表头和表身,所以我首先想到的就是table表格组件。 表格组件中常见的就是:标题和内容一一对应: 像效果图中的效果,只用基础的表格布局是不行的,因…...

【考前预习】4.计算机网络—网络层
往期推荐 【考前预习】3.计算机网络—数据链路层-CSDN博客 【考前预习】2.计算机网络—物理层-CSDN博客 【考前预习】1.计算机网络概述-CSDN博客 目录 1.网络层概述 2.网络层提供的两种服务 3.分类编址的IPV4 4.无分类编址的IPV4—CIDR 5.IPV4地址应用规划 5.1使用定长子…...

【java】MDC
目录 1. 说明2. 作用3. 使用4. 与TraceID的关系5. 注意事项 1. 说明 1.MDC(Mapped Diagnostic Context)是一个用于在多线程环境中追踪和传递日志上下文信息的机制。2.映射诊断环境。3.MDC是一个线程本地的、可维护的、可传递的上下文环境。4.它允许开发…...

Android 好的开源库
1. 权限请求框架 GitHub - getActivity/XXPermissions: Android 权限请求框架,已适配 Android 14 2. 下载框架 GitHub - lingochamp/okdownload: A Reliable, Flexible, Fast and Powerful download engine....

Go 语言结构
Go 语言结构 Go 语言,也称为 Golang,是一种由 Google 开发和支持的静态类型、编译型编程语言。它于 2009 年首次发布,旨在提高多核处理器、网络资源和大型代码库的性能。Go 语言以其简洁的语法、并发支持和强大的标准库而闻名,特别适合构建高性能的网络服务和分布式系统。…...

【漆学军】MT5几个重要类库的使用例子
MT5编程,有两种方式,一种是函数式编程,一种是面向对象编程。 面向对象编程,会让我们编写代码变得非常简单。 面向对象编程,主要是要熟悉4个类库。 #include <Trade\PositionInfo.mqh> #include <Trade\Tra…...

在 Ubuntu 24.04.1 LTS (WSL) 中使用 openssl 生成 keybox.xml
看到“生成 keybox.xml”,大概率都会联想到 PIF 和 Tricky Store。这里就不多解释它们的用途了。最近在网上看到生成非 AOSP keybox 的教程,在这里做一些补充,并将代码打包成一个 Python 脚本。 参考自: Idea 提供者:…...

【JavaSE基础】第十六章:IO流
一、理解 1.简单而言:流就是内存与存储设备之间传输数据的通道、管道。 2.流的分类: (1) 按方向 ( 以 JVM 虚拟机为参照物 ) 【重点】 输入流:将< 存储设备 > 中的内容读入到 < 内存 > 中。 输…...

常见漏洞—SSRF_FastCGI
FastCGI协议 简介 Fast CGI源自旧版本的CGI 路由/结构图 # 访问url --> 浏览器生成HTTP请求报文 --> web server解析请求(例如nginx) web server 是内容的分发者 当访问静态页面时,web server 会直接返回资源,例如index.htm…...

LeetCode 283.移动零(超简单讲解)
283.移动零 题目示例示例1示例2 解题思路快慢指针实现设计 详细代码 题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 示例1 …...

GIS原理及应用、地理坐标系与投影坐标系
文章目录 一、GIS定义1.1 地理信息系统1.2 建模1.3 相关教程1.4 GIS前沿方向 二、GIS数据格式2.1 矢量2.2 栅格2.3 矢量与栅格的区别 三、GIS数据组织3.1 抽象3.2 分层3.3 栅格与切片 四、坐标系4.1 坐标系简介4.2 大地坐标系GCS4.3 投影坐标系PCS4.4 投影变换 五、空间数据库与…...

用github镜像加速, --recursive还是去github站怎么处理?
小伙伴们大多碰到过github抽风的情况,时通时断,时快时慢,非常考验心情。 以前碰到连不上的时候,我大多就是在gitee和gitcode网站找一下镜像,找到后直接git clone 新地址即可。但是碰到 --recursive的时候就不行了&…...

ctfshow-web 151-170-文件上传
151. 我们首先想到就是上传一句话木马。但是看源代码限制了png。 (1)改前端代码。 这里是前端限制了上传文件类型,那我们就改一下就好了嘛,改成php。 这里直接修改不行,给大家推荐一篇简短文章,大家就会了(…...

【电源专题】开关转换器使能(EN)管脚的几种不同方式
我们的文章说到了很多与使能有关的电源案例和原理,如下所示: 【电源专题】案例:芯片规格书使能定义高电平最小阈值1.4V,那真的是到1.4V时才开始输出?_芯片的电流阀值-CSDN博客...

5G学习笔记之SNPN系列之ID和广播消息
目录 1. 概述 2. SNPN ID 3. SNPN广播消息 1. 概述 SNPN:Stand-alone Non-Public Network,独立的非公共网络,由NPN独立运营,不依赖与PLMN网络。 SNPN不支持的5GS特性: 与EPS交互 emergency services when the UE acce…...

Qt-Advanced-Docking-System配置及使用、心得
Qt-Advanced-Docking-System 1. Qt-Advanced-Docking-System描述2. 功能特点2.1. 灵活的停靠方式2.2. 嵌套停靠2.3. 自定义布局保存与恢复2.4. 外观和行为定制 3. 与Qt原生停靠系统的比较4. 使用场景4.1. 集成开发环境(IDE)4.2. 图形设计软件4.3. 数据分…...

【Bolt.new + PromptCoder】三分钟还原油管主页
【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网:PromptCoder Bolt官网:https://bolt.new/ Bolt 是什么? Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示(Prompt)、运行&#x…...

影像组学+病理组学+深度学习人工智能应用
影像组学 基础学习内容: 特征提取:使用pyradiomics进行形状、纹理、小波变换等特征提取。特征筛选:应用ICC、相关系数、mRMR、Lasso等方法。建模:使用LR、SVM、RF、XGBoost、LightGBM等机器学习算法。模型评估:通过A…...

RK3568平台(基础篇)io命令支持
一.什么是io命令 “io” 命令通常用于显示 Linux 系统中的 I/O 统计信息。它提供了有关磁盘读写操作的详细信息,包括每个块设备的读写次数、读写扇区数、读写延迟等。io命令可以直接操作某个寄存器,用于查看设置某个GPIO 引脚配置了什么iomux。 二.io命令支持 RK平台要支持…...

Yolov8源码分析
1、目录介绍 主要目录ultralitics(重点) 1、assets目录 这个文件保存了YOLO历史上可以说是最经典的两张图片,供大家测试程序来使用的。 2、cfg 这个文件下面保存了我们的模型配置文件,cfg目录是项目配置的集中地,其…...

Python中的装饰器`@functools.lru_cache`:用法、来源与应用 (中英双语)
今天看到一段源码 https://github.com/google-research/google-research/blob/master/instruction_following_eval/instructions_util.py 如下,对其中使用的装饰器函数感到好奇,所以产生了这篇博客。 functools.lru_cache(maxsizeNone) def _get_sentenc…...

思维图(GoT):解锁大模型解决复杂问题的能力
今天分享的是苏黎世联邦理工学院、华沙理工大学和Cledar联合发表的一篇文章:思维图:用大语言模型解决复杂问题 论文题目:Graph of Thoughts: Solving Elaborate Problems with Large Language Models 论文链接:https://arxiv.or…...

使用winscp从windows访问Ubuntu进行文件传输
Ubuntu 系统上的准备工作 • 安装 SSH 服务器: 确保 Ubuntu 系统上已经安装了 SSH 服务器。如果没有安装,可以使用以下命令安装: sudo apt update sudo apt install openssh-server • 启动 SSH 服务: 确保 SSH 服务正在运行&a…...

Java全栈项目:实验室预约管理系统的设计与实现
一、项目介绍 实验室预约管理系统是一个基于Java全栈技术开发的Web应用系统,旨在提供便捷的实验室预约、管理和使用体验。本系统主要面向高校师生,实现实验室资源的智能化、信息化管理。 二、技术栈 前端技术 Vue.jsElement UIAxiosVue RouterVuex …...

使用 esrally race 测试 Elasticsearch 性能及 Kibana 可视化分析指南
前言: 在对 Elasticsearch 集群进行性能测试与调优的过程中,esrally 是官方推荐的测试工具。通过 esrally race 命令,我们可以模拟各种查询与索引负载,对集群进行基准测试。然而,仅看 esrally 的终端输出并不直观&…...

OpenAI 第七日 推出了一项新功能——ChatGPT的“Projects”
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

【小白51单片机专用教程】protues仿真AT89C51入门
课程特点 无需开发板0基础教学软件硬件双修辅助入门 本课程面对纯小白,因此会对各个新出现的知识点在实例基础上进行详细讲解,有相关知识的可以直接跳过。课程涉及protues基本操作、原理图设计、数电模电、kell使用、C语言基本内容,所有涉及…...

正则表达式——元字符匹配(单字符)
单字符匹配: ###注意事项:前面要加r:如(re.findall(r\w,字符串名)) #. :匹配任意一个字符 (.本身通过\.匹配) # [ ]: 匹配[ ]中的字符 # \d: 匹配数字 # \D: 匹配非数字 # \s: 匹配空白(空格) # \S:匹配非空白 # \w: 匹配单词字符(a…...

快速在远程服务器执行命令、批量在多个服务器执行命令(基于sshpass的自定义脚本fastsh)
在日常服务器操作中,很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景,不断的切换命令会话窗口会比较麻烦。基于此,编写了本文中的 fastsh 脚本用于轻度解决这种问题,提高一定的便利性。 使…...