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文件中,开启持久化

以上就是本篇文章的全部内容,想了解更多的前端内容,请关注本博主~~

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

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

相关文章

算法-图-数据结构(邻接矩阵)-BFS广度优先遍历

邻接矩阵广度优先遍历&#xff08;BFS&#xff09;是一种用于遍历或搜索图的算法&#xff0c;以下是具体介绍&#xff1a; 1. 基本概念 图是一种非线性的数据结构&#xff0c;由顶点和边组成&#xff0c;可分为无向图、有向图、加权图、无权图等。邻接矩阵是表示图的一种数…

Ryu:轻量开源,开启 SDN 新程

1. Ryu 控制器概述 定位&#xff1a;轻量级、开源的SDN控制器&#xff0c;专为开发者和研究人员设计&#xff0c;基于Python实现。开发者&#xff1a;由日本NTT实验室主导开发&#xff0c;遵循Apache 2.0开源协议。核心理念&#xff1a;简化SDN应用开发&#xff0c;提供友好的…

内容中台架构下智能推荐系统的算法优化与分发策略

内容概要 在数字化内容生态中&#xff0c;智能推荐系统作为内容中台的核心引擎&#xff0c;承担着用户需求与内容资源精准匹配的关键任务。其算法架构的优化路径围绕动态特征建模与多模态数据融合展开&#xff0c;通过深度强化学习技术实现用户行为特征的实时捕捉与动态更新&a…

【odoo18-文件管理】在uniapp上访问odoo系统上的图片

在uniapp上访问odoo系统上的图片 1、以url的形式访问 a&#xff1a;以odoo本身的域名&#xff0c;比如http://127.0.0.1:8069/web/image/product.template/3/image_128?unique1740380422000&#xff0c;这种方式需要解决跨域的问题。 b&#xff1a;以文件服务器的形式&…

DeepSeek掘金——基于DeepSeek-R1构建文档问答机器人

DeepSeek掘金——基于DeepSeek-R1构建文档问答机器人 在这个项目中,我们将结合本地 AI 的隐私与 Deepseek R1 的智能,创建一个完全本地化、推理驱动的问答机器人。 在人工智能 (AI) 日益融入我们日常生活的时代,一个问题仍然处于最前沿:隐私。尽管基于云的 AI 系统功能强大…

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

将maya模型物体材质转化为面材质

将maya模型物体材质转化为面材质&#xff0c;以在导出abc时继承材质信息&#xff1b; 运行一下python代码&#xff1a; import maya.cmds as cmds objListcmds.ls(slTrue) for obj in objList:shapeNodeNamecmds.listRelatives(obj, shapesTrue)sgNodesListcmds.listConnecti…

数据库面试题(基础常考!!!)

在数据库领域&#xff0c;无论是日常开发还是面试场景&#xff0c;都有一些高频且重要的问题需要我们深入理解和掌握。本文将对这些常见面试题进行详细阐述&#xff0c;帮助大家更好地应对面试和实际工作中的挑战。 面试题一&#xff1a;三范式详解 什么是三范式 三范式是关…

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

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

鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar)

鸿蒙开发深入浅出01&#xff08;基本环境搭建、页面模板与TabBar&#xff09; 1、效果展示2、下载 DevEco Studio3、创建项目4、新建页面模板5、更改应用信息6、新建以下页面7、Index.ets8、真机运行9、图片资源文件 1、效果展示 2、下载 DevEco Studio 访问官网根据自己的版本…

蓝桥杯第十六届嵌入式模拟编程题解析

由硬件框图可以知道我们要配置LED 和按键 LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&#xf…

二叉树的遍历知识点及习题

一、知识点 1二叉树的遍历理解为按照预先定好的搜索路径访问树里的每个节点&#xff0c;且每个节点仅访问一次 2假设根节点为N&#xff0c;左子树为L&#xff0c;右子树为R&#xff0c;常见的三种遍历方法分别是先&#xff08;前&#xff09;序遍历NLR 根左右&#xff0c;中序…

“conda”不是内部或外部命令,也不是可运行的程序或批处理文件

有的时候&#xff0c;我们发现在cmd黑框中输入conda时&#xff0c;cmd会显示“conda”不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件&#xff0c;那这时候该怎么解决呢&#xff1f; Step01&#xff1a;我们找到Anconda的安装目录。然后找到里面的bin文件夹&am…

特辣的海藻!3

基础知识点 判断一个数是否是2的幂次 方法一&#xff1a;位运算 所有2的幂次数的二进制表示中有且仅有一个1&#xff0c;进行位运算 n&(n-1) 后结果为0 检查正数&#xff1a;n > 0&#xff08;负数和0不是2的幂次&#xff09;位运算&#xff1a; n & ( n -1) 会…

苍穹外卖中的模块总结

本文总结苍穹外卖项目中可复用的通用设计 sky-common constant存放常量类&#xff0c;包括消息常量&#xff0c;状态常量 context是上下文对象&#xff0c;封装了threadlocal package com.sky.context;public class BaseContext {public static ThreadLocal<Long> thre…

Threejs教程一【三要素】

场景 场景是一个容器&#xff0c;用于容纳所有的物体、光源、相机等元素。 // 创建场景 const scene new THREE.Scene(); //修改背景颜色&#xff0c;颜色支持十六进制、rgb、hsl、贴图等 scene.background new THREE.Color(0x000000);相机 相机决定了渲染的结果&#xff…

Deepseek和Grok 3对比:写一段冒泡排序

1、这是访问Grok 3得到的结果 2、grok3输出的完整代码&#xff1a; def bubble_sort(arr):n len(arr) # 获取数组长度# 外层循环控制排序轮数for i in range(n):# 内层循环比较相邻元素&#xff0c;j的范围逐渐减少for j in range(0, n - i - 1):# 如果当前元素大于下一个元…

TCP/UDP调试工具推荐:Socket通信图解教程

TCP/UDP调试工具推荐&#xff1a;Socket通信图解教程 一、引言二、串口调试流程三、下载链接 SocketTool 调试助手是一款旨在协助程序员和网络管理员进行TCP和UDP协议调试的网络通信工具。TCP作为一种面向连接、可靠的协议&#xff0c;具有诸如连接管理、数据分片与重组、流量和…

Open WebUI 是什么

Open WebUI 是什么 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 https://github.com/open-webui/open-webui 🚀 …

登录-05.JWT令牌-介绍

一.JWT令牌 JWT令牌是一种简洁的、自包含的格式&#xff0c;用于在通讯双方之间以json数据格式安全的传输数据。说白了&#xff0c;JWT令牌就是将json格式的数据进行封装&#xff0c;从而实现安全传输。 所谓简洁&#xff0c;就是指JWT令牌就是一个简单的字符串。 所谓自包含…