Tag标签的使用
一个非常适合运用在vue项目中的组件:Tag标签。
目录
一、准备工作
1、安装element-plus库
2、配置element-plus库
二、Tag标签入门
1、打开element官网,搜索tag标签
2、体验Tag标签的基础用法
三、Tag标签进阶训练1
1、定义一个数组,并使用v-for指令,渲染Tag标签
2、查看运行效果
四、Tag标签进阶训练2
1、安装、配置Pinia
①安装pinia
②配置pinia到项目中
2、使用pinia存储所需的数据和方法
①在src路径下,创建TagStore.js
②在TagStore.js中,编写所需的数据和方法
3、在components目录下,创建自定义组件Tag.vue
4、在所需页面中,使用自定义组件Tag.vue
5、给路由添加meta属性
6、效果展示
五、完善四的功能
1、功能1:点击Tag标签,跳转到对应的路由(页面)。
效果展示
2、功能2:点击Tag标签的关闭按钮,所触发的事件
效果展示
效果展示
六、最重要的一点:Pinia默认不会持久化数据,因此每当一刷新页面,pinia的数据就会重置,因此需要再下载一个pinia持久化插件
1、下载pinia持久化插件pinia-plugin-persistedstate
2、在main.js中,令pinia使用该插件
3、在pinia的js文件中,开启持久化
一、准备工作
1、安装element-plus库
npm install element-plus 基于vue3的组件库(按钮、表单等)
2、配置element-plus库

二、Tag标签入门
1、打开element官网,搜索tag标签

2、体验Tag标签的基础用法
<el-tag>标签一</el-tag>
<el-tag type="success">标签二</el-tag>
<el-tag type="info">标签三</el-tag>
<el-tag type="warning">标签四</el-tag>
<el-tag type="danger">标签五</el-tag>
将上述代码直接粘贴到项目中,如下:

查看页面效果:

可见,基本雏形已经出现。其中type代表着每个Tag标签的类型(type不同,颜色就不同)。
三、Tag标签进阶训练1
1、定义一个数组,并使用v-for指令,渲染Tag标签

其中,
v-for=“tag in tags”表示从tags数组中,依次取出对象tag,因此tags数组中有多少个对象,就会渲染多少条<el-tag></el-tag>
:key表示每一个标签都是互不相同的,因此可以使用tag.name来充当。
closable=“true”表示每一个标签都是可以通过叉号来关闭的。
:type=“tag.type”表示根据tag.type动态渲染标签的类型(颜色)
{{ tag.name}}表示根据tag.name给标签名进行动态赋值。
2、查看运行效果

四、Tag标签进阶训练2
1、安装、配置Pinia
①安装pinia
# 下载pinia的依赖到项目中
npm install pinia
②配置pinia到项目中

2、使用pinia存储所需的数据和方法
①在src路径下,创建TagStore.js

②在TagStore.js中,编写所需的数据和方法
//该方法用于实例化一个存储信息的对象
import {defineStore} from 'pinia'
import {ref} from 'vue'//实例化一个存储信息的对象tagStore
const tagStore = defineStore("tagStore",()=>{//tagStore实体中的属性1:tags数组,里面的元素是对象,对应一个Tag标签const tags = ref([{title:'首页',path:'/index',name:'Index',},{title:'窗口挂号',path:'/registration/onsite_registration',name:'onsite_registration',},{title:'窗口退号',path:'/registration/registration_record',name:'registration_record'},{title:'患者查看',path:'/physician/home_medical_record',name:'home_medical_record'},{title:'病例首页',path:'/physician/home_medical_record',name:'home_medical_record'},{title:'开设处方',path:'/physician/write_prescription',name:'write_prescription'},{title:'药房发药',path:'/drugstore/give_medicine',name:'give_medicine'},])//tagStore实体中的属性2:currentMenu,用来记住当前位于哪一个菜单选项const currentMenu = ref(null);//tagStore实体中的方法1:点击某个菜单时,将其添加为tag const setTag = (newTag)=>{//newTag表示传入进来的数组,里面携带着tag对象//alert("新传入的对象是"+JSON.stringify(newTag))//不知道是啥if(newTag.path=='/index'){currentMenu.value=null;}//往tags数组里面添加tag对象else{//查找(找到,则返回对应的index;如果未找到,返回-1)let index = tags.value.findIndex(item=>item.title == newTag.title);//寻找下标的标准:item.title == newTagInfo.title item指的是tags数组中的每一个对象//alert("index的值是: " + index)//判断是否存在,不存在就加入到tags数组index === -1?tags.value.push(newTag):'';//alert('操作完,TagStore中的tags数组的值是: ' + JSON.stringify(tags.value))}}//tagStore实体中的方法2:移除tagconst removeTag = (removeTagInfo)=>{//-:寻找所要删除的tag在tags列表中的下标let index = tags.value.findIndex(item => item.title == removeTagInfo.title);//-:根据该下标,删除该tagtags.value.splice(index, 1);//从索引index的位置开始,删除1个标签}//返回上述定义的两个属性、两个方法return {tags,currentMenu,setTag,removeTag}},{//persist 选项可以让 Pinia 存储的数据在页面刷新或会话结束后仍然保留。persist:true//意思是持久化}
)//导出(上面起的名字就是tagStore)
export default tagStore
3、在components目录下,创建自定义组件Tag.vue
<template><div class="tags"><el-tagv-for="(tag, index) in tags":key="tag.name":closable="tag.title != '首页'":effect="route.meta.title === tag.title ? 'dark' : 'plain'"type="warning"@click="clickTag(tag, index)"@close="closeTag(tag, index)">{{ tag.title }}</el-tag></div>
</template><script setup>
//获取TagStore.js中的数据和方法
import tagStore from "@/store/TagStore";
import { effect } from "vue";
const tagStoreInfo = tagStore();
//获取TagStore中的tags数组
const tags = tagStoreInfo.tags;
console.log(123456789);//获取路由
import {useRoute, useRouter} from 'vue-router'
const route = useRoute();
const router = useRouter();
//console.log("当前的路由的title(用来渲染Tag标签高亮)是: "+route.meta.title)
</script><style scoped>
.tags {display: flex; /* 设置为弹性盒子 */flex-wrap: wrap;gap: 5px; /* 间隔 */margin-top: 10px; /* 和上面的间距 */
}
</style>
其中,
v-for="(tag, index) in tags"表示从数组tags中,依次取出对象tag,下标index依次为0,1,2,3....
:key="tag.name"表示使用对象tag的name属性,作为每个Tag标签的唯一标识。
:closable="tag.title != '首页'"表示首页不可关闭,而其他页面携带关闭按钮。
:effect="route.meta.title === tag.title ? 'dark' : 'plain'"表示当前路由对应的Tag标签高亮显示,而其他页面是灰暗状态。
type="warning"表示所有的Tag标签的类型为warning,即颜色为黄。
@click="clickTag(tag, index)"代表点击Tag标签时触发的事件。
@close="closeTag(tag, index)"代表关闭Tag标签时触发的事件。
4、在所需页面中,使用自定义组件Tag.vue
①导入自定义组件
<script setup>
//导入Tag组件
import Tag from '@/components/Tag.vue';</script>
②使用自定义组件

5、给路由添加meta属性

:effect="route.meta.title === tag.title ? 'dark' : 'plain'"
就表示了,当前路由对应的Tag标签要高亮显示。
6、效果展示

五、完善四的功能
1、功能1:点击Tag标签,跳转到对应的路由(页面)。

//获取路由
import {useRoute, useRouter} from 'vue-router'
const route = useRoute();
const router = useRouter();
//console.log("当前的路由的title(用来渲染Tag标签高亮)是: "+route.meta.title)//编写点击事件clickTag
const clickTag = (tag, index) => {//alert('Tag标签的信息:' + tag.title + index + tag.path)//跳转路由,到所点击Tag标签的path路径router.push(tag.path)
}
效果展示

2、功能2:点击Tag标签的关闭按钮,所触发的事件

//获取TagStore.js(Pinia)中的数据和方法
import tagStore from "@/store/TagStore";
const tagStoreInfo = tagStore();
//获取TagStore中的tags数组
const tags = tagStoreInfo.tags;//编写关闭事件closeTag(tag, index)
const closeTag = (tag, index) => {//特殊情况:如果关闭的是当前路由对应的那个Tag标签(即:高亮的Tag标签)if(route.meta.title === tag.title){//route.meta.title表示当前路由的标题(这是在路由index.js中定义的)//特殊情况一:如果关闭的是当前路由对应的那个Tag标签(即:高亮的Tag标签)且是最后一个Tag标签,则跳转路由到上一个Tag标签的pathif(index === tags.length-1){//alert("这的确是最后一个Tag标签")//将路由跳转到上一个Tag标签router.push(tags[index-1].path)//移除当前Tag标签tags.splice(index,1)}//特殊情况二:如果关闭的是当前路由对应的那个Tag标签(即:高亮的Tag标签)且不是最后一个Tag标签,则跳转路由到下一个Tag标签的pathelse{//alert("要跳转到" + tags[index+1].title)router.push(tags[index+1].path)//移除当前Tag标签tags.splice(index,1)}}//普通情况:从tags数组中,将下标为index的tag对象移除即可else{tags.splice(index,1)//举例:index为2,则:如果想移除下标为2(第3个)的元素,则需要从第2个开始,移除1个元素。}
}
效果展示

3、功能3:点击左侧菜单栏,就能往pinia的TagStore.js的tags数组中添加一个对象,用来渲染Tag标签

//获取到pinia的TagStore.js中的数据和方法
import tagStore from "@/store/TagStore";
const tagStoreInfo = tagStore();
//获取TagStore中的tags数组(其实没用上)
const tags = tagStoreInfo.tags;//点击"窗口挂号",触发事件@click="btn1_1"
const btn1_1 = ()=> {//alert("点击了窗口挂号")//先查看原来的tags数组中有啥对象//alert(tags)//通过TagStore.js提供的setTag方法,向tags数组中添加一个对象const newTag = ref({title:'窗口挂号',path:'/registration/onsite_registration',name:'onsite_registration',})tagStoreInfo.setTag(newTag.value)
}//点击"窗口退号",触发事件@click="btn1_2"
const btn1_2 = () => {//alert("点击了窗口退号")//先查看原来的tags数组中有啥对象//alert(tags)//通过TagStore.js提供的setTag方法,向tags数组中添加一个对象const newTag = ref({title:'窗口退号',path:'/registration/registration_record',name:'registration_record',})tagStoreInfo.setTag(newTag.value)
}//点击"患者查看",触发事件@click="btn2_1"
const btn2_1 = () => {const newTag = ref({title:'患者查看',path:'/physician/physician_patient',name:'physician_patient',})tagStoreInfo.setTag(newTag.value)
}//点击"病例首页",触发事件@click="btn2_2"
const btn2_2 = () => {const newTag = ref({title:'病例首页',path:'/physician/home_medical_record',name:'home_medical_record',})tagStoreInfo.setTag(newTag.value)
}//点击"开设处方",触发事件@click="btn2_3"
const btn2_3 = () => {const newTag = ref({title:'开设处方',path:'/physician/write_prescription',name:'write_prescription',})tagStoreInfo.setTag(newTag.value)
}//点击"药房发药",触发事件@click="btn3_1"
const btn3_1 = () => {const newTag = ref({title:'药房发药',path:'/drugstore/give_medicine',name:'give_medicine',})tagStoreInfo.setTag(newTag.value)
}
效果展示

六、最重要的一点:Pinia默认不会持久化数据,因此每当一刷新页面,pinia的数据就会重置,因此需要再下载一个pinia持久化插件
1、下载pinia持久化插件pinia-plugin-persistedstate
npm install pinia-plugin-persistedstate
2、在main.js中,令pinia使用该插件

3、在pinia的js文件中,开启持久化

以上就是本篇文章的全部内容,想了解更多的前端内容,请关注本博主~~
相关文章:
Tag标签的使用
一个非常适合运用在vue项目中的组件:Tag标签。 目录 一、准备工作 1、安装element-plus库 2、配置element-plus库 二、Tag标签入门 1、打开element官网,搜索tag标签 2、体验Tag标签的基础用法 三、Tag标签进阶训练1 1、定义一个数组,…...
DeepSeek系统架构的逐层分类拆解分析,从底层基础设施到用户端分发全链路
一、底层基础设施层 1. 硬件服务器集群 算力单元: GPU集群:基于NVIDIA H800/H100 GPU构建,单集群规模超10,000卡,采用NVLink全互联架构实现低延迟通信。国产化支持:适配海光DCU、寒武纪MLU等国产芯片,通过…...
Linux:(3)
一:Linux和Linux互传(压缩包) scp:Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的,rcp 是不加密的,scp 是…...
el-select滚动获取下拉数据;el-select滚动加载
el-select下拉获取数据 1.解决问题2.封装MyScrollSelect组件3.使用MyScrollSelect组件 1.解决问题 场景:下拉数据量过大,后端提供一个分页查询接口;需要每次滚动加载下一页的下拉数据 且单选的状态,需要支持回显,通过n…...
HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索
【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果:准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中…...
计算机视觉(opencv-python)入门之常见图像处理基本操作(待补充)
图像预处理是计算机视觉任务中的关键步骤,它通过对原始图像进行处理,以提高后续图像分析、特征提取和识别的准确性。 示例图片 目录 常见图像预处理方法 灰度化处理 法一 法二 说明 切片截取部分图像数据 cv2.cvtColor() 颜色空间转换 cv2.spli…...
采用DDNS-GO与cloudflare实现双域名同时访问NAS
这个标题其实解释的还不够清楚,本人是小白,但是买了群晖的NAS后自己瞎折腾了一下,遇到了如下的问题: 1、家里是移动宽带,没有公网IP,因此Ipv4无法使用,IPV6可以正常使用。 2、办公室场地采用的…...
w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介
概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板,支持IEEE802.11 b/g/n Wi-Fi,以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器,主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装,PCB板载天线,…...
【UCB CS 61B SP24】Lecture 16 - Data Structures 2: ADTs, BSTs学习笔记
本文首先介绍了抽象数据类型与树的概念,接着重点讲解二叉搜索树的定义与操作方式,并用 Java 实现一个标准的二叉搜索树结构。 1. 抽象数据类型 首先引入一个概念叫做抽象数据类型(Abstract Data Type,ADT)࿰…...
RabbitMQ系列(零)概要
一、消息队列总览 1. 什么是消息队列? 消息队列(Message Queue)是一种异步通信机制,允许分布式系统中的服务通过生产-消费模型传递数据。其核心价值在于: 解耦性:生产者与消费者无需同时在线或直接交互削…...
Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
HarmonyOS Design 介绍
HarmonyOS Design 介绍 文章目录 HarmonyOS Design 介绍一、HarmonyOS Design 是什么?1. 设计系统(Design System)2. UI 框架的支持3. 设计工具和资源4. 开发指南5. 与其他设计系统的对比总结 二、HarmonyOS Design 特点 | 应用场景1. Harmon…...
云计算如何解决延迟问题?
在云计算中,延迟(latency)指的是从请求发出到收到响应之间的时间间隔。延迟过高可能会严重影响用户体验,特别是在需要实时响应的应用中,如在线游戏、视频流、金融交易等。云计算服务如何解决延迟问题,通常依…...
【算法系列】快速排序详解
文章目录 快速排序的多种实现方式1. 基本快速排序(Lomuto 分区方案)1.1 基本原理1.2 步骤1.3 Java 实现示例 2. Hoare 分区方案2.1 基本原理2.2 步骤2.3 Java 实现示例 3. 三数取中法3.1 基本原理3.2 步骤3.3 Java 实现示例 4. 尾递归优化4.1 基本原理4.…...
电脑键盘知识
1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区,使用前需先按Fn键 1.1、功能区 ESC:退出 F1:显示帮助信息 F2:重命名 F4:重复上一步操作 F5:刷新网页 …...
Grok 3 vs. DeepSeek vs. ChatGPT:2025终极AI对决
2025 年,AI 领域的竞争愈发激烈,三个重量级选手争夺霸主地位:Grok 3(由 xAI 开发)、DeepSeek(国内 AI 初创公司)和 ChatGPT(OpenAI 产品)。每个模型都有自己独特的优势,无论是在深度思考、速度、编程辅助、创意输出,还是在成本控制方面,都展现出强大的实力。但究竟…...
【MySQL篇】数据库基础
目录 1,什么是数据库? 2,主流数据库 3,MySQL介绍 1,MySQL架构 2,SQL分类 3,MySQL存储引擎 1,什么是数据库? 数据库(Database,简称DB…...
vscode java环境中文乱码的问题
先说我的结论: 由于我的系统是windows的,所以vscode使用的是默认gbk的编码进行的。 但是我的目的是全部都使用utf-8,因为我的程序始终是要去linux上去运行的,总不能在本地是好的,然后到服务器上就不行了吧,…...
基于SpringBoot+mybatisplus+vueJS的Cosplay文化展示与交流社区设计与实现
博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…...
组件传递props校验
注意:prop是只读的!不可以修改父组件的数据。 可以检验传过来的内容是否类型没问题。 App.vue <template><div><!-- <parentDemo/> --><componentA/></div></template> <script> import ComponentA …...
数据结构与算法-图论-最短路-拓展运用
选择最佳路线 分析: 这是一道图论中的最短路径问题,目标是在给定的公交网络中,找到从琪琪家附近的车站出发,到她朋友家附近车站(编号为 s )的最短时间。以下是对该问题的详细分析: 问题关键信息…...
0—QT ui界面一览
2025.2.26,感谢gpt4 1.控件盒子 1. Layouts(布局) 布局控件用于组织界面上的控件,确保它们的位置和排列方式合理。 Vertical Layout(垂直布局) :将控件按垂直方向排列。 建议:适…...
纷析云:赋能企业财务数字化转型的开源解决方案
在企业数字化转型的浪潮中,财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案,为企业提供了一条理想的转型路径。 一、开源的力量:自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…...
P8716 [蓝桥杯 2020 省 AB2] 回文日期
1 题目说明 2 题目分析 暴力不会超时,O(n)的时间复杂度, < 1 0 8 <10^8 <108。分析见代码: #include<iostream> #include<string> using namespace std;int m[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};// 判断日期…...
(十)趣学设计模式 之 外观模式!
目录 一、 啥是外观模式?二、 为什么要用外观模式?三、 外观模式的实现方式四、 外观模式的优缺点五、 外观模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...
apache-maven-3.2.1
MAVEN_HOME D:\apache-maven-3.2.1 PATH D:\apache-maven-3.2.1\bin cmd mvn -v <localRepository>d:\localRepository</localRepository> setting.xml <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Soft…...
编程题-连接两字母单词得到的最长回文串(中等)
题目: 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们,并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长回文串的 长度…...
react 新手入门指南,常用命令
React 是一个用于构建用户界面的 JavaScript 库,它通过组件化的方式构建应用程序的 UI,适用于构建单页应用(SPA)。以下是一个详细的 React 新手入门指南,包括常用命令和基本概念。 1. 环境准备 在开始之前,确保你已经安装了 Node.js 和 npm。可以通过以下命令检查版本:…...
论文笔记(七十二)Reward Centering(三)
Reward Centering(三) 文章概括摘要3 基于值的奖励中心化4 案例研究: 以奖励为中心的 Q-learning5 讨论、局限性与未来工作致谢 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…...
【论文笔记-ECCV 2024】AnyControl:使用文本到图像生成的多功能控件创建您的艺术作品
AnyControl:使用文本到图像生成的多功能控件创建您的艺术作品 图1 AnyControl的多控制图像合成。该研究的模型支持多个控制信号的自由组合,并生成与每个输入对齐的和谐结果。输入到模型中的输入控制信号以组合图像显示,以实现更好的可视化。 …...
