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:移除tag
        const removeTag = (removeTagInfo)=>{
            //-:寻找所要删除的tag在tags列表中的下标
            let index = tags.value.findIndex(item => item.title == removeTagInfo.title);
            //-:根据该下标,删除该tag
            tags.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-tag
      v-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标签的path
    if(index === tags.length-1){
      //alert("这的确是最后一个Tag标签")
      //将路由跳转到上一个Tag标签
      router.push(tags[index-1].path)
      //移除当前Tag标签
      tags.splice(index,1)
    }
    //特殊情况二:如果关闭的是当前路由对应的那个Tag标签(即:高亮的Tag标签)且不是最后一个Tag标签,则跳转路由到下一个Tag标签的path
    else{
      //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文件中,开启持久化

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习threejs,使用createMultiMaterialObject创建多材质对象

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.SceneUtils 场景操控…

[C++]使用纯opencv部署yolov12目标检测onnx模型

yolov12官方框架&#xff1a;sunsmarterjie/yolov12 【算法介绍】 在C中使用纯OpenCV部署YOLOv12进行目标检测是一项具有挑战性的任务&#xff0c;因为YOLOv12通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff…

MQ(Message Queue)

目录 MQ(Message Queue)基本概念 为什么要使用消息队列&#xff1f; 使用消息队列有什么缺点&#xff1f; 如何保证消息不丢失?(如何保证消息的可靠性传输?/如何处理消息丢失的问题?) 通用的MQ场景&#xff1a; RabbitMQ如何保证消息不丢失&#xff1f; 生产者丢数据…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器

1、谷歌浏览器下载&#xff1a; 情况一&#xff1a;如果谷歌应用商店可以打开&#xff0c;那么就直接到谷歌应用商店下载&#xff0c;直接搜索vue.js.devtools添加扩展即可。 情况二&#xff1a;谷歌浏览器的谷歌应用商城打不开&#xff0c;那么就百度搜索极简插件找到vue.js.…

基于TensorFlow.js与Web Worker的智能证件照生成方案

功能简介 本文基于TensorFlow.js与Web Worker实现了常用的“证件照”功能&#xff0c;可以对照片实现抠图并替换背景。值得一提的是&#xff0c;正常抠图的操作应该由后端进行&#xff0c;这里只是主要演示该功能实现步骤&#xff0c;并不建议该功能由前端全权处理。 限于个人技…

3D模型在线转换工具:轻松实现3DM转OBJ

3D模型在线转换是一款功能强大的在线工具&#xff0c;支持多种3D模型格式的在线预览和互转。无论是工业设计、建筑设计&#xff0c;还是数字艺术领域&#xff0c;这款工具都能满足您的需求。 3DM与OBJ格式简介 3DM格式&#xff1a;3DM是一种广泛应用于三维建模的文件格式&…

GEO数据结构

目录 1. GEOADD 2. GEODIST 3. GEOHASH 3. GEOHASH 4. GEOPOS 6. GEOSEARCH 7. GEOSEARCHSTORE 应用场景 代码的逻辑分解&#xff1a; 比较难懂的部分&#xff1a; Redis GEO 查询与分页 results 的结构&#xff1a; 分页处理与截取数据 附加距离信息 1. GEOADD…

Java基础常见的面试题(易错!!)

面试题一&#xff1a;为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”&#xff08;又称 “钻石问题”&#xff09;&#xff0c;即一个子类从多个父类继承到同名方法或属性时&#xff0c;编译器无法确定该调用哪个父类的成员。同时&#xff0c;多继承…

基于Python/Flask/机器学习链家网新房数据可视化及预测系统+万字文档+答辩PPT+指导搭建视频

技术栈&#xff1a; 编程语言&#xff1a;python 涉及技术&#xff1a;requests爬虫、mysql数据库、flask框架、scikit-learn机器学习预测算法、多元线性回归、Echarts可视化。 ①.需求分析&#xff1a; 1.数据爬取&#xff1a;自动化获取链家网新房数据。 2.数据存储&…

【DeepSeek-R1背后的技术】系列十一:RAG原理介绍和本地部署(DeepSeekR1+RAGFlow构建个人知识库)

【DeepSeek-R1背后的技术】系列博文&#xff1a; 第1篇&#xff1a;混合专家模型&#xff08;MoE&#xff09; 第2篇&#xff1a;大模型知识蒸馏&#xff08;Knowledge Distillation&#xff09; 第3篇&#xff1a;强化学习&#xff08;Reinforcement Learning, RL&#xff09;…

力扣LeetCode:1656 设计有序流

题目&#xff1a; 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) 对&#xff0c;并在多次调用时 按 id 递增的顺序…

MATLAB在数据分析和绘图中的应用:从基础到实践

引言 股票数据分析是金融领域中的重要研究方向&#xff0c;通过对历史价格、成交量等数据的分析&#xff0c;可以帮助投资者更好地理解市场趋势和做出决策。MATLAB作为一种强大的科学计算工具&#xff0c;提供了丰富的数据处理和可视化功能&#xff0c;非常适合用于股票数据的…

2025年02月17日Github流行趋势

项目名称&#xff1a;OmniParser 项目地址url&#xff1a;https://github.com/microsoft/OmniParser 项目语言&#xff1a;Jupyter Notebook 历史star数&#xff1a;8971 今日star数&#xff1a;969 项目维护者&#xff1a;yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kris…

Keepalive基础

一。简介和功能 vrrp协议的软件实现&#xff0c;原生设计目的是为了高可用ipvs服务 功能&#xff1a; 1.基于vrrp协议完成地址流动 2.为vip地址所在的节点生成ipvs规则&#xff08;在配置文件中预先定义&#xff09; 3.为ipvs集群的各RS做健康状况检测 4.基于脚本调用接口…

vue3: directive自定义指令防止重复点击

第一章 前言 相信很多小伙伴会在各个渠道上搜如何防止重复点击&#xff0c;之后会推荐什么防抖、节流来避免这一操作&#xff0c;该方法小编就不继续往下说了。接下来说说小编的场景&#xff0c;项目已经完成的差不多了&#xff0c;但是由于之前大家都是直接点击事件调用方法的…

第4章 4.3 EF Core 的实体类配置 Data Annatation Fluent API

4.3.1 约定大于配置 主要的约定规则&#xff1a; 规则 1: 数据库表名采用上下文类中对应的 DbSet 的属性名。 规则 2:数据库表列的名字采用实体类属性的名字&#xff0c;列的数据类型采用和实体类属性类型 兼容的类型。比如在 SQLServer 中&#xff0c;string 类型对应 nvarc…

【Redis 原理】通信协议 内存回收

文章目录 通信协议--RESP内存回收内存过期策略惰性删除周期删除 内存淘汰策略 通信协议–RESP Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&#xff09;&#xff1a; 客户端&#xff08;client&#xff09;向服务端&#xff08;se…

【GreenHills】GHS合并库文件

1、 文档目标 解决Green Hills对于多个库文件合并问题 2、 问题场景 客户具有多个工程库文件。但是&#xff0c;客户想要在项目最终交付的时候&#xff0c;通过将多个库文件打包成一个库文件&#xff0c;进行交付。 3、软硬件环境 1&#xff09;、软件版本&#xff1a;MULTI…