element el-table树形表格结构,勾选联动 父级勾选,子级全部选中,勾选子级,父级显示勾选状态

news2025/2/27 5:29:57

需求实现如下

在这里插入图片描述

在这里插入图片描述

重点使用到 @select 以及 @select-all 两个方法

在这里插入图片描述

返回数据格式

在这里插入图片描述

代码实现

 <el-table ref="tableRef" :cell-style="{ color: '#FFF', background: '#333' }"
      :header-cell-style="{ color: '#FFF', background: '#333' }" 
      row-key="id" :data="tableData" style="width: 100%"
      :default-sort="{ prop: 'barcode.putInDate', order: 'descending' }"
      @select="select" 
      @select-all="selectAll"
      @sort-change="sortChange" :tree-props="{
        children: 'children',
        hasChildren: 'hasChildren',
      }
  ">
      <template slot="empty">
        <span style="color: #969799">{{ $t("NeoLight.empty") }}</span>
      </template>
      <el-table-column type="selection" width="50" />
      <el-table-column prop="barcode" :sortable="true" :label="$t('NeoLight.barcodeNo')" width="180" />
      <el-table-column prop="partNumber" :sortable="true" :label="$t('NeoLight.stockNo')" width="150" />
      <el-table-column prop="produceDate" :sortable="true" :label="$t('NeoLight.produceDate')" />
      <el-table-column prop="expireDate" :sortable="true" :label="$t('NeoLight.expireDate')" />
       <el-table-column prop="batch" :sortable="true" :label="$t('barcode.batch')" />
      <!-- 供应商 -->
      <el-table-column prop="provider" :sortable="true" :label="$t('storagePos.providerNumber')" />
      <el-table-column prop="posName" :sortable="true" :label="$t('NeoLight.storageNo')" />
</el-table>

js方法

 methods: {
 //从查询接口中获取到表格数据并组装数据
     getList() {
      getStoFind(this.crud.query)
        .then((res) => {
          if (res.totalElements) {
            this.tableData = [];
            this.ids = []
            this.totalPageNum = res.totalElements
            res.content.forEach((item) => {
              if (item.barcode && item.barcode.children && item.barcode.children.length > 0) {
                item.barcode.children.map(ch => {
                  ch.posId = item.id
                  ch.parentId = item.barcode.id
                })
              }
              item.barcode.posId = item.id;
              this.tableData.push(item.barcode);
            });
          }
        })
    },
    select(selection, row) {
      let vm = this
      // 操作行 row 在 已选范围 selection 内,认为是选中,否则是取消选中 
      if (selection.some((el) => row.id
        === el.id
      )) {
        // 设置当前行选中状态
        row.isChecked = true
        // 记录选中id 
        this.addId(row)
        // 若存在子级,自己全选
        if (row.children) {
          row.children.map(c => {
            this.$refs.tableRef.toggleRowSelection(c, true)
            c.isChecked = true
            this.addId(c)
          })
        }
        // 若存在父级,设置父级选中
        if (row.parentId) {
          let pNode = vm.tableData.find(x => x.id === row.parentId)
          this.$refs.tableRef.toggleRowSelection(pNode, true)
          pNode.isChecked = true
          this.addId(pNode)
        }
      } else {
        row.isChecked = false
        this.deleteId(row)
        // 若存在子级,子级全部取消选中
        if (row.children) {
          row.children.map((i) => {
            this.$refs.tableRef.toggleRowSelection(i, false)
            i.isChecked = false
            this.deleteId(i)
          })
        }
        // 若存在父级,判断父级的子级(当前行的兄弟) ,若全部未选中,取消父级选中
        if (row.parentId) {
          let pNode = vm.tableData.find(x => x.id === row.parentId)
          if (!pNode.children.some(el => el.isChecked == true)) {
            this.$refs.tableRef.toggleRowSelection(pNode, false)
            pNode.isChecked = false
            this.deleteId(pNode)
          }
        }
      }
    },
    selectAll(selection) {
      // 判断当前是否有已选中的
      let rA = this.tableData.some(el => {
        let r = false
        if (el.children) {
          r = el.children.some(e => e.isChecked)
        }
        if (r) return r
        return el.isChecked
      })
      // 若有选中则全部取消,否则全部选中
      if (rA) {
        this.tableData.forEach(el => {
          el.isChecked = false
          this.$refs.tableRef.toggleRowSelection(el, false)
          this.deleteId(el)
          if (el.children) {
            el.children.forEach(e => {
              e.isChecked = false
              this.$refs.tableRef.toggleRowSelection(e, false)
              this.deleteId(e)
            })
          }
        })
      } else {
        this.tableData.forEach(el => {
          el.isChecked = true
          this.$refs.tableRef.toggleRowSelection(el, true)
          this.addId(el)
          if (el.children) {
            el.children.forEach(e => {
              e.isChecked = true
              this.$refs.tableRef.toggleRowSelection(e, true)
              this.addId(e)
            })
          }
        })
      }
    },
    // 增加选中
    addId(o) {
      let id = o.posId
      if (this.ids.indexOf(id) < 0) {
        this.ids.push(id)
      }
    },
    // 删除选中
    deleteId(o) {
      let id = o.posId
      this.ids = this.ids.filter(item => item !== id);
    },
}    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统 面试题(二)

PART1 1.乐观锁和悲观锁的区别是什么&#xff1f; 2.乐观锁和悲观锁的实现方式分别有哪些&#xff1f; 3.平均周转时间如何计算&#xff1f; 4.银行家算法是什么&#xff1f; 5.IO多路复用是什么&#xff1f; 6.HTTP的头部包含哪些内容&#xff1f; 7.TCP如何保持连接&a…

HTTP 原理与CND原理

1 HTTP 原理 HTTP是一个无状态的协议。无状态是指客户机&#xff08;Web浏览器&#xff09;和服务器之间不需要建立持久的连接&#xff0c;这意味着当一个客户端向服务器端发出请求&#xff0c;然后服务器返回响应(response)&#xff0c;连接就被关闭了&#xff0c;在服务器端…

NSA 和 CISA 揭示十大网络安全错误配置

美国国家安全局 (NSA) 和网络安全与基础设施安全局 (CISA) 在5日公布了其红蓝团队在大型组织网络中发现的十大最常见的网络安全错误配置。 通报还详细介绍了威胁行为者使用哪些策略、技术和程序 (TTP) 来成功利用这些错误配置来实现各种目标&#xff0c;包括获取访问权限、横向…

内存空间扩充之进程覆盖技术,交换技术

1.覆盖技术 人们引入了覆盖技术&#xff0c;用来解决“程序大小超过物理内存总和”的问题。 一个固定区&#xff1a; 存放最活跃的程序段固定区中的程序段在运行过程中不会调入调出 若干覆盖区&#xff1a; 不可能同时被访问程序段可共享一个覆盖区覆盖区中的程序段在运行…

MySQL慢查询的原因与解决方案

一、前言 在数据库系统中&#xff0c;慢查询是一个常见的问题。特别是在MySQL中&#xff0c;由于其复杂的查询结构和大量的数据&#xff0c;慢查询可能会导致系统性能下降&#xff0c;甚至影响整个应用的运行。本文将详细介绍MySQL慢查询的原因&#xff0c;并提供一些有效的解…

基于springboot实现火车订票管理系统项目【项目源码+论文说明】计算机毕业设计

摘要 本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述火车订票管理系统的当前背景以及系统开发的…

免备案域名 DNS解析

1、注册购买域名地址&#xff08;免备案&#xff09; Name.com | Domain Names, Registration, Websites & Hosting 注意国家选中国区才可以使用支付宝&#xff0c;信息填写完之后创建账号&#xff0c;邮箱填写自己的邮箱 2、注册完登录账号进去找到Domain Name 搜索自动…

SOLIDWORKS® 2024 新功能 - 3D CAD

1、 先前版本的兼容性 • 利用您订阅的 SOLIDWORKS&#xff0c;可将您的 SOLIDWORKS 设计作品保存为旧版本&#xff0c;与使用旧版本 SOLIDWORKS 的供应商无缝协作。 • 可将零件、装配体和工程图保存为新版本前两年之内的SOLIDWORKS 版本。 优点&#xff1a; 即使其他用户正…

信息系统项目管理师第四版学习笔记——高级项目管理

项目集管理 项目集管理角色和职责 在项目集管理中涉及的相关角色主要包括&#xff1a;项目集发起人、项目集指导委员会、项目集经理、其他影响项目集的干系人。 项目集发起人和收益人是负责承诺将组织的资源应用于项目集&#xff0c;并致力于使项目集取得成功的人。 项目集…

Lego Studio打开solidworks零件/装配体 (sw另存obj文件)

solidworks 2020 Lego studio / part designer 截至2023-10-13&#x1f382;最新版 文章目录 操作步骤1&#xff09; solidworks 开启 ScanTo3D 功能2&#xff09; 零件 / 装配体 保存至stl格式文件3&#xff09; 以SanTo3D网格文件方式打开stl4&#xff09; 将打开的stl另存为…

港联证券:三季报亮相 盈利拐点来了?

10月12日&#xff0c;跟着黄山胶囊宣布深市2023年首份三季报&#xff0c;以及华辰装备宣布创业板首份三季报&#xff0c;第一批宣布三季报的A股公司增至5家。 Wind数据闪现&#xff0c;到10月12日记者发稿时&#xff0c;A股共有208家上市公司宣布了本年三季度成果预告&#xf…

基于 ACK Fluid 的混合云优化数据访问(五):自动化跨区域中心数据分发

作者&#xff1a;车漾 前文回顾&#xff1a; 本系列将介绍如何基于 ACK Fluid 支持和优化混合云的数据访问场景&#xff0c;相关文章请参考&#xff1a; -基于 ACK Fluid 的混合云优化数据访问&#xff08;一&#xff09;&#xff1a;场景与架构 -基于 ACK Fluid 的混合云优…

用wpf替代winform 解决PLC数据量过大页面卡顿的问题

winform 由于不是数据驱动, 页面想刷新数据必须刷新控件, wpf则不用. 可以利用wpf 的数据绑定和IOC, 页面中的消息传递, itemscontrol 实现大量数据刷新, 上位机页面不卡顿 代码如下: <Windowx:Class"NavTest.Views.NewMainView"xmlns"http://schemas.micr…

Linu:【Kafka四】集群介绍与单机搭建

目录 环境简介 一、搭建kafka集群 1.1、复制出两个kafka的配置文件 1.2、修改配置文件中的如下属性 二、启动kafka集群 三、可校验kafka三个节点是否均启动成功 四、查看集团中主题的分区和副本 4.1、新建一个包含了分区和副本的主题 4.2、查看该主题的详细信息 五、…

EDI入门讲解——一篇文章告诉你EDI是什么

知行软件从2008年开始做EDI解决方案&#xff0c;多年来帮助国内企业建立起与交易伙伴的EDI连接&#xff0c;在国内市场已有较高的市场份额。 我们在国内有自己的研发、实施和运维团队。如果您在产品使用过程中有任何问题、有任何功能上的需求、或者在我们产品中发现了错误&…

Talk | SIGGRAPH‘23 Best Paper 秦颖思:分罗曼三维显示器—各点独立变焦显示技术

本期为TechBeat人工智能社区第537期线上Talk。 北京时间10月12日&#xff08;周四&#xff09;20:00&#xff0c;卡耐基梅隆大学博士生—秦颖思的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “分罗曼三维显示器—各点独立变焦显示技术”&#xf…

C++入门1

C入门1 1.前言2.命名空间1.C语言对于命名空间方面的缺陷2.命名空间的语法特性1.域作用限定符2.命名空间的可嵌套性 3.声明与定义分离的命名空间4.命名空间的展开5.多个命名空间中命名冲突6.对于命名空间的推荐写法 3.iostream1.cout和endl2.cin 3.缺省参数1.缺省参数的形式2.缺…

从零开始学习调用百度地图网页API:二、初始化地图,鼠标交互创建信息窗口

目录 代码结构headbodyscript 调试 代码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name"viewport" content"initial-scale1.0, user-scalable…

进阶JAVA篇- Math 类和 System 类和 Runtime 类的常用API(三)

目录 API 1.0 Math 类的说明 1.1 Math 类中的 abs() 方法 1.2 Math 类中的 ceil () 方法 1.3 Math 类中的 floor () 方法 1.4 Math 类中的 round () 方法 1.5 Math 类中的 max() 和 min() 方法 1.6 Math 类中的 pow(double a , double b) 方法 1.7 Math 类中的 random&a…

案例|美创科技守护健康“一盘棋”,医共体整体数据安全建设实践

以医共体之“通”&#xff0c;破解看病之“痛”。在县域组建医疗共同体&#xff0c;逐步实现区域内医疗资源共享&#xff0c;推动形成基层首诊、双向转诊、急慢分治、上下联动的分级诊疗模式&#xff0c;是实现“首诊在基层、大病不出县”&#xff0c;更好地为全县人民群众服务…