element ui Tag 动态添加标签

2023-10-27

1.首先调接口获取到标签列表,

 // 级联选择器如果选择的不是第三级菜单
    async getParamsData() {
      if (this.selectedCateKeys.length !== 3) {
        // 级联选择器不会有参数,下面的面板也都为空
        this.selectedCateKeys = []
        this.manyTableData = []
        this.onlyTableData = []
        return
      }
      // 如果选中的是三级分类
      console.log(this.selectedCateKeys)
      // 根据所选分类的Id,和当前所处的面板,获取对应的参数
      const { data: res } = await this.$http.get(`categories/${this.cateId}/attributes`, {
        params: { sel: this.activeName },
      })

      if (res.meta.status !== 200) {
        return this.$message.error('获取参数列表失败!')
      }
      //将获取到的参数做处理
      res.data.forEach((item) => {
        // 将res.data的参数做处理 --------------------------  attr_vals记住这个,对标签进行增删都要用它
        // item.attr_vals = item.attr_vals ? item.attr_vals.split(' ') : []
        item.attr_vals = item.attr_vals.length === 0 ? [] : item.attr_vals.split(' ') //split(' ')表示将字符串转为数组,因为 attr_vals里面已经有都好进行分隔,所以这里不需要写逗号
        //有了这个,相当于给每个数据加上了文本显示与隐藏的属性,在插槽里面就可以直接调用到,就不会造成之间的相互影响了
        item.inputVisible = false
        //有了这个,相当于给每个数据加上了文本框值属性,在插槽里面就可以直接调用到,就不会造成之间的相互影响了
        item.inputValue = ''
      })

      console.log(res.data)
      if (this.activeName === 'many') {
        this.manyTableData = res.data
      } else {
        this.onlyTableData = res.data
      }
    },

上面的一些配套内容:

 data() {
    return {
     
      // 级联选择框双向绑定到的数组(他的长度可以让我们拿到三级分类的id)
      selectedCateKeys: [],
      // 被激活的页签的名称(因为点击哪个表格是不确定的,所以需要这个)
      activeName: 'many',
      // 动态参数的数据(表格一的数据)
      manyTableData: [],
      // 静态属性的数据(表格二的数据)
      onlyTableData: [],
}
},
 computed: {
   
    // 当前选中的三级分类的Id--------------------这个cateId在将新添加的内容保存到数据库,调接口删除用户,点击添加框和修改框确定按钮都要用到
    cateId() {
      if (this.selectedCateKeys.length === 3) {
        return this.selectedCateKeys[2]
      }
      return null
    },
    
  },

2.这是标签列表的html结构(elementui组件)

 <!-- 展开行 -->
            <el-table-column type="expand">
              <!-- 插槽 -->
              <template slot-scope="scope">
                <!-- 循环渲染Tag标签  closable为标签加上❌号      @close="handleClose(i, scope.row)"关闭tag标签时触发的事件 -->
                <el-tag v-for="(item, i) in scope.row.attr_vals" :key="i" closable @close="handleClose(i, scope.row)">{{ item }}</el-tag>
                <!-- 输入的文本框 -->
                <!--  @keyup.enter.native="handleInputConfirm(scope.row)" 点击回车键是触发-->
                <!-- @blur="handleInputConfirm(scope.row)"在 Input 失去焦点时触发 -->
                <el-input
                  class="input-new-tag"
                  v-if="scope.row.inputVisible"
                  v-model="scope.row.inputValue"
                  ref="saveTagInput"
                  size="small"
                  @keyup.enter.native="handleInputConfirm(scope.row)"
                  @blur="handleInputConfirm(scope.row)"
                >
                </el-input>
                <!-- 添加按钮 -->
                <el-button v-else class="button-new-tag" size="small" @click="showInput(scope.row)">+ New Tag</el-button>
              </template>
            </el-table-column>

3.标签变成文本框

 // 点击+ New Tag按钮
    showInput(row) {
      // 显示输入框
      row.inputVisible = true
      // 让文本框自动获得焦点
      // $nextTick 方法的作用,就是当页面上文本框渲染出来之后,才会去调用.focus()函数让文本框获得焦点
      this.$nextTick((_) => {
        this.$refs.saveTagInput.focus()
      })
    },

4.文本框变成标签

 // 文本框失去焦点,或摁下了 Enter 都会触发
    async handleInputConfirm(row) {
      // 如果文本框里面没有内容,就重置文本框并且关闭文本框变回Tag标签
      if (row.inputValue.trim().length === 0) {
        row.inputValue = ''
        row.inputVisible = false
        return
      }
      // 如果有内容,则将内容去除空格后添加进attr_vals数组里面-------------(attr_vals数组就是标签里面的内容)
      row.attr_vals.push(row.inputValue.trim())
      // 重置文本框
      row.inputValue = ''
      // 关闭文本框变回Tag标签
      row.inputVisible = false
      // 将新添加的内容保存到数据库(只有保存进数据库才可以真正的保存进attr_vals数组)
      this.saveAttrVals(row)
    },

5.将刚才变成的标签保存进数据库,这样标签即使刷新后也能存在了

  // 将新添加的内容保存到数据库(保存完后不要刷新页面,不然会关闭展开行,导致体验不好)
    async saveAttrVals(row) {
      // 需要发起请求,保存这次操作
      const { data: res } = await this.$http.put(`categories/${this.cateId}/attributes/${row.attr_id}`, {
        attr_name: row.attr_name,
        attr_sel: row.attr_sel,
        attr_vals: row.attr_vals.join(' '), // 将数组转换为字符串(因为接口上说这个参数只要字符串)(因为我们拿过来时将这个参数转成了数组,现在我们是转回去)
      })

      if (res.meta.status !== 200) {
        return this.$message.error('修改参数项失败!')
      }

      this.$message.success('修改参数项成功!')
    },

6.点击标签的叉号删除标签(也要保存进数据库)

 // 关闭tag标签时触发的事件
    handleClose(i, row) {
      row.attr_vals.splice(i, 1) //删除attr_vals数组里面的点击关闭的这个标签
      // 刷新将新添加的内容保存到数据库这个函数
      this.saveAttrVals(row)
    },

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

element ui Tag 动态添加标签 的相关文章

随机推荐

  • vue3-print-nb 实现页面打印(含分页打印)

    安装vue3 print nb npm install vue3 print nb save 引用vue3 print nb 全局引入 全局引用 import createApp from vue import App from App v
  • 左程云算法笔记(三)堆排序、桶排序、排序总结

    左程云算法笔记 三 堆 堆结构 堆排序 堆排序扩展题 桶排序 计数排序 基数排序 补 桶排序 补 希尔排序 排序总结 稳定性 综合比较 常见的坑 工程上对排序的改进 堆 堆结构 1 堆结构就是用数组实现的完全二叉树结构 2 完全二叉树中如果
  • Spring Boot使用(基础)

    目录 1 Spring Boot是什么 2 Spring Boot使用 2 1Spring目录介绍 2 2SpringBoot的使用 1 Spring Boot是什么 Spring Boot就是Spring脚手架 就是为了简化Spring开
  • 权重设计介绍

    相关产品 RocketMQ 之前在阿里的 负载均衡 比赛中 就有这个算法 RocketMQ 中包含多种负载算法 其中 权重 算法就属于其中一种 也是最实用的一种 奖励系统 经常会有许多活动 或则任务 当用户完成后 可以获得相关的奖励 当然可
  • 华为OD机试 - 评论转换输出(Java)

    题目描述 在一个博客网站上 每篇博客都有评论 每一条评论都是一个非空英文字母字符串 评论具有树状结构 除了根评论外 每个评论都有一个父评论 当评论保存时 使用以下格式 首先是评论的内容 然后是回复当前评论的数量 最后是当前评论的所有了评论
  • 操作系统内核

    现代操作系统一般将OS划分为若干个层次 再将OS的不同功能分别设置在不同的层次中 通常将一些与硬件紧密相关的模块 如中断处理程序等 各种常用及运行频率较高的模块 如时钟管理 进程调度和许多模块所公用的二些基本操作 都安排在紧靠硬件的软件层次
  • vue生命周期

    随着对 vue 的不断了解 会越来越发现它生命周期的重要性 只有了解了它的生命周期 才能在开发项目的时候在逻辑上的很好的判断什么时候该发生什么事件 即很好的控制页面 一 什么是 vue 生命周期 Vue 实例从创建到销毁的过程 就是生命周期
  • kong+Verdaccio+ldap(docker)

    需求 使用Kong来代理Verdaccio 实现直接通过域名 path的方式来访问 并且Verdaccio使用ldap来管理 前提 Kong ldap已部署好 并且也部署好了Kong Dashboard 后面有需求再写关于Kong代理的各种
  • 国内的Ubuntu镜像源

    国内的Ubuntu镜像源 Ubuntu清华镜像源 今天学习docker需要在线Ubuntu镜像 所以做了一个镜像下载地址笔记 方面以后的下载 官方镜像下载访问地址 https cn ubuntu com download alternati
  • 明哥复习MyBatis(1)

    这不是原创 借鉴尚硅谷的 不是原创 一 核心配置文件详解
  • impdp或expdp报错ORA-39002: invalid operation,ORA-39070: Unable to open the log file

    oracle oracle rac01 backup cat expdp par USERID as sysdba DIRECTORY KMDATA EXP job name jinky exp filesize 5000m paralle
  • Java集合——Iterable和Iterator接口介绍

    Iterable Iterable和Iterator是什么 Iterable源码 Iterator源码 使用 Iterable和Iterator是什么 Iterable是Collection的实现接口 即是集合的最顶级父类 Iterator
  • 小白学股票基金_2

    到底是买股票还是买基金 说基金和股票差不多指的应该是偏股型基金 但是基金里面还有债券型 QDII以及非常大众化的货币型基金 众所周知的余额宝就是一款货币型基金啦 等等 风险等级也不一样 所以 为防止这样混为一谈 我们这里讨论的就是炒股和买偏
  • 0.0 Windows + Linux(Ubuntu20.04) 超简单的双系统安装

    目录 一 U盘启动盘的制作 1 下载操作系统 2 下载U启动制作工具 二 磁盘分配 三 Ubuntu20 04系统安装 1 修改bios为U启动 2 安装配置Ubuntu 2 1 Install Ubuntu 2 2 安装关键之处在于分区
  • 4年经验来面试20K的测试岗,连基础都不会,还不如招应届生!

    公司前段时间缺人 也面了不少测试 结果竟然没有一个合适的 一开始瞄准的就是中级的水准 也没指望来大牛 提供的薪资在10 20k 面试的人很多 但平均水平很让人失望 看简历很多都是3 4年工作经验 但面试中 不提工具和编程 仅仅基础的技术很多
  • Flink简单教学5-时间

    时间 Time Flink支持三种不同的时间 处理时间 processing time 指当前操作的时间 如 map 当程序以处理时间运行 所有基于时间的操作 窗口 都依赖各个operator的机器时间 事件时间 event time 事件
  • office 2010 projectn visio 下载

    Office 2010 project专业版 64位 ed2k file cn project professional 2010 x64 515551 exe 453437272 84D14496F889767D46C9DE576154B
  • 矩阵的基本演算

    目录 转置 逆 迹 行列式 转置 A B T
  • 网易低代码引擎Tango正式开源

    一 Tango简介 Tango 是一个用于快速构建低代码平台的低代码设计器框架 借助 Tango 只需要数行代码就可以完成一个基本的低代码平台前端系统的搭建 Tango 低代码设计器直接读取前端项目的源代码 并以源代码为中心 执行和渲染前端
  • element ui Tag 动态添加标签

    1 首先调接口获取到标签列表 级联选择器如果选择的不是第三级菜单 async getParamsData if this selectedCateKeys length 3 级联选择器不会有参数 下面的面板也都为空 this selecte