当前位置: 首页 > article >正文

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标签的关闭按钮,所触发的事件

效果展示

3、功能3:点击左侧菜单栏,就能往pinia的TagStore.js的tags数组中添加一个对象,用来渲染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项目中的组件&#xff1a;Tag标签。 目录 一、准备工作 1、安装element-plus库 2、配置element-plus库 二、Tag标签入门 1、打开element官网&#xff0c;搜索tag标签 2、体验Tag标签的基础用法 三、Tag标签进阶训练1 1、定义一个数组&#xff0c;…...

DeepSeek系统架构的逐层分类拆解分析,从底层基础设施到用户端分发全链路

一、底层基础设施层 1. 硬件服务器集群 算力单元&#xff1a; GPU集群&#xff1a;基于NVIDIA H800/H100 GPU构建&#xff0c;单集群规模超10,000卡&#xff0c;采用NVLink全互联架构实现低延迟通信。国产化支持&#xff1a;适配海光DCU、寒武纪MLU等国产芯片&#xff0c;通过…...

Linux:(3)

一&#xff1a;Linux和Linux互传&#xff08;压缩包&#xff09; scp:Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的&#xff0c;rcp 是不加密的&#xff0c;scp 是…...

el-select滚动获取下拉数据;el-select滚动加载

el-select下拉获取数据 1.解决问题2.封装MyScrollSelect组件3.使用MyScrollSelect组件 1.解决问题 场景&#xff1a;下拉数据量过大&#xff0c;后端提供一个分页查询接口&#xff1b;需要每次滚动加载下一页的下拉数据 且单选的状态&#xff0c;需要支持回显&#xff0c;通过n…...

HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索

【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果&#xff1a;准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代&#xff0c;地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及&#xff0c;如何在鸿蒙应用中…...

计算机视觉(opencv-python)入门之常见图像处理基本操作(待补充)

图像预处理是计算机视觉任务中的关键步骤&#xff0c;它通过对原始图像进行处理&#xff0c;以提高后续图像分析、特征提取和识别的准确性。 示例图片 目录 常见图像预处理方法 灰度化处理 法一 法二 说明 切片截取部分图像数据 cv2.cvtColor() 颜色空间转换 cv2.spli…...

采用DDNS-GO与cloudflare实现双域名同时访问NAS

这个标题其实解释的还不够清楚&#xff0c;本人是小白&#xff0c;但是买了群晖的NAS后自己瞎折腾了一下&#xff0c;遇到了如下的问题&#xff1a; 1、家里是移动宽带&#xff0c;没有公网IP&#xff0c;因此Ipv4无法使用&#xff0c;IPV6可以正常使用。 2、办公室场地采用的…...

w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介

概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板&#xff0c;支持IEEE802.11 b/g/n Wi-Fi&#xff0c;以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器&#xff0c;主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装&#xff0c;PCB板载天线&#xff0c;…...

【UCB CS 61B SP24】Lecture 16 - Data Structures 2: ADTs, BSTs学习笔记

本文首先介绍了抽象数据类型与树的概念&#xff0c;接着重点讲解二叉搜索树的定义与操作方式&#xff0c;并用 Java 实现一个标准的二叉搜索树结构。 1. 抽象数据类型 首先引入一个概念叫做抽象数据类型&#xff08;Abstract Data Type&#xff0c;ADT&#xff09;&#xff0…...

RabbitMQ系列(零)概要

一、消息队列总览 1. 什么是消息队列&#xff1f; 消息队列&#xff08;Message Queue&#xff09;是一种异步通信机制&#xff0c;允许分布式系统中的服务通过生产-消费模型传递数据。其核心价值在于&#xff1a; 解耦性&#xff1a;生产者与消费者无需同时在线或直接交互削…...

Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

HarmonyOS Design 介绍

HarmonyOS Design 介绍 文章目录 HarmonyOS Design 介绍一、HarmonyOS Design 是什么&#xff1f;1. 设计系统&#xff08;Design System&#xff09;2. UI 框架的支持3. 设计工具和资源4. 开发指南5. 与其他设计系统的对比总结 二、HarmonyOS Design 特点 | 应用场景1. Harmon…...

云计算如何解决延迟问题?

在云计算中&#xff0c;延迟&#xff08;latency&#xff09;指的是从请求发出到收到响应之间的时间间隔。延迟过高可能会严重影响用户体验&#xff0c;特别是在需要实时响应的应用中&#xff0c;如在线游戏、视频流、金融交易等。云计算服务如何解决延迟问题&#xff0c;通常依…...

【算法系列】快速排序详解

文章目录 快速排序的多种实现方式1. 基本快速排序&#xff08;Lomuto 分区方案&#xff09;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. 数字键盘区 笔记本电脑键盘的功能区&#xff0c;使用前需先按Fn键 1.1、功能区 ESC&#xff1a;退出 F1&#xff1a;显示帮助信息 F2&#xff1a;重命名 F4&#xff1a;重复上一步操作 F5&#xff1a;刷新网页 …...

Grok 3 vs. DeepSeek vs. ChatGPT:2025终极AI对决

2025 年,AI 领域的竞争愈发激烈,三个重量级选手争夺霸主地位:Grok 3(由 xAI 开发)、DeepSeek(国内 AI 初创公司)和 ChatGPT(OpenAI 产品)。每个模型都有自己独特的优势,无论是在深度思考、速度、编程辅助、创意输出,还是在成本控制方面,都展现出强大的实力。但究竟…...

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…...

vscode java环境中文乱码的问题

先说我的结论&#xff1a; 由于我的系统是windows的&#xff0c;所以vscode使用的是默认gbk的编码进行的。 但是我的目的是全部都使用utf-8&#xff0c;因为我的程序始终是要去linux上去运行的&#xff0c;总不能在本地是好的&#xff0c;然后到服务器上就不行了吧&#xff0c;…...

基于SpringBoot+mybatisplus+vueJS的Cosplay文化展示与交流社区设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…...

组件传递props校验

注意&#xff1a;prop是只读的&#xff01;不可以修改父组件的数据。 可以检验传过来的内容是否类型没问题。 App.vue <template><div><!-- <parentDemo/> --><componentA/></div></template> <script> import ComponentA …...

数据结构与算法-图论-最短路-拓展运用

选择最佳路线 分析&#xff1a; 这是一道图论中的最短路径问题&#xff0c;目标是在给定的公交网络中&#xff0c;找到从琪琪家附近的车站出发&#xff0c;到她朋友家附近车站&#xff08;编号为 s &#xff09;的最短时间。以下是对该问题的详细分析&#xff1a; 问题关键信息…...

0—QT ui界面一览

2025.2.26&#xff0c;感谢gpt4 1.控件盒子 1. Layouts&#xff08;布局&#xff09; 布局控件用于组织界面上的控件&#xff0c;确保它们的位置和排列方式合理。 Vertical Layout&#xff08;垂直布局&#xff09; &#xff1a;将控件按垂直方向排列。 建议&#xff1a;适…...

纷析云:赋能企业财务数字化转型的开源解决方案

在企业数字化转型的浪潮中&#xff0c;财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案&#xff0c;为企业提供了一条理想的转型路径。 一、开源的力量&#xff1a;自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…...

P8716 [蓝桥杯 2020 省 AB2] 回文日期

1 题目说明 2 题目分析 暴力不会超时&#xff0c;O(n)的时间复杂度&#xff0c; < 1 0 8 <10^8 <108。分析见代码&#xff1a; #include<iostream> #include<string> using namespace std;int m[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};// 判断日期…...

(十)趣学设计模式 之 外观模式!

目录 一、 啥是外观模式&#xff1f;二、 为什么要用外观模式&#xff1f;三、 外观模式的实现方式四、 外观模式的优缺点五、 外观模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…...

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…...

编程题-连接两字母单词得到的最长回文串(中等)

题目&#xff1a; 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们&#xff0c;并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长回文串的 长度…...

react 新手入门指南,常用命令

React 是一个用于构建用户界面的 JavaScript 库,它通过组件化的方式构建应用程序的 UI,适用于构建单页应用(SPA)。以下是一个详细的 React 新手入门指南,包括常用命令和基本概念。 1. 环境准备 在开始之前,确保你已经安装了 Node.js 和 npm。可以通过以下命令检查版本:…...

论文笔记(七十二)Reward Centering(三)

Reward Centering&#xff08;三&#xff09; 文章概括摘要3 基于值的奖励中心化4 案例研究&#xff1a; 以奖励为中心的 Q-learning5 讨论、局限性与未来工作致谢 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…...

【论文笔记-ECCV 2024】AnyControl:使用文本到图像生成的多功能控件创建您的艺术作品

AnyControl&#xff1a;使用文本到图像生成的多功能控件创建您的艺术作品 图1 AnyControl的多控制图像合成。该研究的模型支持多个控制信号的自由组合&#xff0c;并生成与每个输入对齐的和谐结果。输入到模型中的输入控制信号以组合图像显示&#xff0c;以实现更好的可视化。 …...