多层级table联动

news2024/12/25 1:13:02

elementui 多层级table联动:
引用:
https://blog.csdn.net/weixin_44780971/article/details/130054925
https://blog.csdn.net/qq_42581563/article/details/114325920


需要了解的属性:
  • @select-all 全选的时候执行
  • @select : 选择一个的时候执行
  • default-expand-all : 默认展开所有行
  • @expand-change : 点击展开,关闭的时候执行的事件
  • :show-header : 是否展示 表头
  • :row-style : 返回每一行的style样式

在这里插入图片描述

使用 toggleRowSelection 更改子table的selection 状态的时候,必须是展开的,使用toggleRowExpansion 将expand展开

父表格的每一行都有一个子表格,,,设置父表格的名字是 main,,, 子表格的名字 是sub+scope.$index ,,每一次selection改变的时候都会传入 当前行,,通过遍历原始总数据,获取到改变的这个行的index,,,,通过这个索引可以确定你选择的子表格的 ref,,进行修改

遇到的问题:
  • this.$nextTick() :
    这个是一个异步方法,,用于在下次DOM更新循环结束之后执行回调函数,,他的作用是等待Vue实例更新DOM,,然后执行回调函数,,确保在更新完成之后再进行操作

  • 勾选的数据怎么传递出来,一般需要的都是子项的选择
    设置了一个set对象 ,,Set里面有 add ,delete,has 等方法,当勾选中的时候,就将那些子项添加进去,取消勾选,就移除,,Set对象不是响应式的,Vue不会对Set对象内容进行深层监听,,使用了一个数组去展示Set的数据,,,Vue对数组和对象的变化可以进行监听和相应
    Set怎么转换成 Array:

    • […set]
    • Array.from(set)
  • 点击展开,关闭的时候,子表格的状态都会被刷新
    @expand-change : 不能获取展开的状态是关闭还是打开,,因为 default-expand-all 最开都是打开,设置一个map存储,当点击那一行之后,将map存的值设置为关闭,根据map的值判断是否是打开,
    打开,根据之前选中存储的值,设置当前selection是否选中

  • scope.$index : 获取索引 scope.row 获取当前行

  • 插槽数据的方法:
    传入你自己的方法,可以使用插槽定义的 slot-scope 调用传入的方法
    在这里插入图片描述

  • vue方法加了括号怎么传递event

<button @click="handleClick($event)">Click me</button>

代码:

<template>
  <div>
<!--
   stripe 和   :row-class-name 不能同时存在,,同时存在显示的 stripe
   -->

    <el-table
      border
      :data="spuList"
      ref="main"
      @selection-change="handleSelectionChange"
      :row-class-name="tableRowClassName"
      height="500"
      highlight-current-row
      @current-change="handleCurrentChange"
      default-expand-all
      :row-style="tableRowStyle"
      @select-all="mainSelectAll"
      @select="mainSelect"
      @expand-change="handleExpandChange"
    >

      <el-table-column type="expand">
        <template slot-scope="scope">
          <el-table
            :data="scope.row.skuList"
            :show-header="false"
            :row-style="tableRowStyle"
            :ref="`sub`+scope.$index"
            @select="subSelect"
            @select-all="subSelectAll"
            @selection-change="handleSubSelectionChange"

          >
            <el-table-column type="selection" width="55" ></el-table-column>
            <el-table-column type="index" ></el-table-column>
            <el-table-column prop="id" label="id"></el-table-column>
            <el-table-column prop="title" label="title"></el-table-column>

          </el-table>
        </template>
      </el-table-column>

      <el-table-column type="selection" width="55"></el-table-column>
      <el-table-column label="title" prop="title" width="200"></el-table-column>
      <el-table-column label="subtitle" prop="subtitle" width="250" show-overflow-tooltip ></el-table-column>
      <el-table-column label="createTime"  width="250">
        <template slot-scope="scope">
          {{ scope.row.createTime}}
        </template>
      </el-table-column>

    </el-table>

    <div>
    <el-button @click="toggleSelection([spuList[1],spuList[2]])">切换第二、第三行的选中状态</el-button>
    <el-button @click="toggleSelection()">取消选择</el-button>
      <el-button @click="handleToggle(spuList[0])"> btn</el-button>
      <el-button @click="setCurrent(spuList[1])">选中第二行</el-button>
    </div>


    <div class="container">
      <el-table
      :data="table">
        <el-table-column prop="id" label="id"></el-table-column>
        <el-table-column prop="title" label="title"></el-table-column>
      </el-table>
    </div>
  </div>

</template>

<script>
import {listSpu} from "@/api/cc/test";

export default {
  name: "index",
  created() {
    listSpu().then(res=>{
      console.log(res)
      this.spuList = res.list
      this.spuList.forEach(item=>{
        this.expandMap.set(item.id,true)
      })
    })
    //

  },
  data() {
    return {
      spuList:[],
      multipleSelection:[],
      subSelection:new Set(),
      expandMap:new Map(),
      table:[]
    }
  },
  methods:{
    handleExpandChange(row,expand){
      var isExpand = this.expandMap.get(row.id);
      if (isExpand){
        this.expandMap.set(row.id,false)
      }else{
        // 打开  显示children 的selection
        this.expandMap.set(row.id,true)
        this.spuList.forEach((item,index)=>{
          if (item.id === row.id){
            this.$refs.main.toggleRowExpansion(item,true)

            this.$nextTick(()=>{
              item.skuList.forEach(childItem=>{
                if (this.subSelection.has(childItem)) {
                  this.$refs[`sub${index}`].toggleRowSelection(childItem,true)
                }
              })
            })

          }
        })
      }
      console.log(row.expanded,row.selected)
      console.log(row,expand,333)
      // this.spuList.forEach((item,index)=>{
      //   if (item.id === row.id){
      //     row.skuList.forEach(item=>{
      //       if (this.subSelection.has(item)) {
      //         // this.
      //       }
      //     })
      //   }
      // })

    },
    handleSubSelectionChange(selection){
     //  selection.forEach(item=>{
     //    this.subSelection.add(item)
     //  })
     // // this.subSelection.
     //  console.log(this.subSelection,999)

    },
    subSelectAll(){
      console.log("sub all")
    },
    subSelect(selection,row){

      if (selection.includes(row)){
        // 添加
        this.subSelection.add(row)
      }else{
        // 删除
        this.subSelection.delete(row)
      }

      // 二级table 是否取消勾选,,全部都没有,就不勾选,有一个就需要勾选
      let isChecked = selection.length>0

      // console.log(selection,row,"erji")
      this.spuList.forEach((item,index)=>{
        // spu 和 sku 一对多
        if (item.id===row.spuId){

          // if (item.skuList.length === selection.length){
          //   isChecked = true
          // }else{
          //   isChecked = false
          // }
          this.$refs.main.toggleRowSelection(item,isChecked)
        }

      })

      // 将set 变成数组
      this.table = Array.from(this.subSelection)
    },
    /**
     * 改变每一个子项 的 selection
     * @param isSelection  是否选中
     */
    toggleChildStatus(isSelection){
      this.spuList.forEach((row,index)=>{
        row.skuList.forEach(item=>{
          this.$refs[`sub${index}`].toggleRowSelection(item,isSelection)
          if (isSelection){
            // 全选
            this.subSelection.add(item)
          }else{
            // 全不选
            this.subSelection.delete(item)
          }
        })
      })

      this.table = [...this.subSelection]
      // console.log(this.subSelection,777)
    },
    // toggleChildrenStatus(),

    mainSelect(selection,row){
      // console.log(selection,row,333)
    //
    //   是否选中这个元素
      var isChecked = selection.includes(row)

      console.log(isChecked,8888)


      this.spuList.forEach((item,index)=>{
        if (item.id===row.id){
          // 展开这个表格,不然会报错
          this.$refs.main.toggleRowExpansion(item,true)


          this.$nextTick(()=>{
            item.skuList.forEach((childRow)=>{
              this.$refs[`sub${index}`].toggleRowSelection(childRow,isChecked)

              if (isChecked){
                this.subSelection.add(childRow)
              }else {
                this.subSelection.delete(childRow)
              }
            })
            // this.$nextTick() 是异步的
            console.log(isChecked,[...this.subSelection],444)
            this.table = [...this.subSelection]
          })

        }
      })


      // console.log(isChecked,[...this.subSelection],555)
    },
    mainSelectAll(selection){
      console.log(selection,111)
      if (selection.length !== 0){
        // this.$refs.main.toggleRowExpansion(row,true)
       this.spuList.forEach((row)=>{
         // 勾选时要展开本行数据,,不然会找不到 子项
         this.$refs.main.toggleRowExpansion(row,true)
         this.$refs.main.toggleRowSelection(row,true)
       })


        this.$nextTick(()=>{
          // 全选
          this.toggleChildStatus(true)
        })


      }else{
        this.spuList.forEach((row)=>{
          // 取消全选也要展开
          this.$refs.main.toggleRowExpansion(row,true)
        })

        // 取消全选
        this.$refs.main.clearSelection()

        this.$nextTick(()=>{
          this.toggleChildStatus(false)
        })

      }

    },
    tableRowStyle({row,rowIndex}){
      return {
        height: '10px !important' ,// 设置每一行的高度为50px
        fontSize:"10px"
      };
    },

    setCurrent(row){
      this.$refs.main.setCurrentRow(row)
    },
    handleCurrentChange(currentRow,oldCurrentRow){
      console.log(currentRow,oldCurrentRow)
    },
    tableRowClassName({row,rowIndex}){
      // 传入一个obj 里面有 row 和 rowIndex
      if (rowIndex===1){
        return "warning-row"
      }else if (rowIndex===3){
        return "success-row"
      }
      return ""
    },
    handleToggle(row){
      this.$refs.main.toggleRowSelection(row)
    },
    toggleSelection(rows){
      if (rows){
        rows.forEach(row=>{
          this.$refs.main.toggleRowSelection(row)
        })
      }else{
        this.$refs.main.clearSelection()
      }
      console.log(rows)
    },
    handleSelectionChange(val){
      this.multipleSelection = val
    }
  }
}
</script>

<style>

.el-table .warning-row {
  background: oldlace;
}

.el-table .success-row {
  background: #f0f9eb;
}

</style>

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

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

相关文章

MySQL 连接查询

文章目录 一&#xff0c;等值连接二&#xff0c;表别名三&#xff0c;多表等值连接四&#xff0c;自然连接五&#xff0c;自连接六&#xff0c;非等值内连接七&#xff0c;外连接&#xff08;一&#xff09;左外连接&#xff08;二&#xff09;右外连接&#xff08;三&#xff…

Cookie与Session的工作流程

文章目录 Cookiecookie的工作流程1.cookie从哪里来2.cookie到哪里去3.cookie是做什么的 SessionSession工作流程 Cookie与Session都是http协议中的机制,都是用来追踪浏览器用户身份的会话方式.但是又有各自的工作流程. Cookie cookie是浏览器在本地存储数据的一种机制。 cookie…

java从入门到起飞——基础概念

目录 背景注释和关键字注释关键字 常量变量数据类型计算存储单元数据类型分类 标识符小驼峰命名法&#xff08;方法、变量&#xff09;大驼峰命名法&#xff08;类&#xff09; 类型转换自动类型转换强制类型转换 计算机中的数据存储总结 背景 学编程这么长时间了&#xff0c;重…

Java Swing花样玩法:教你用代码制作六一儿童节的精美贺卡(简单版)

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;Java经典程序设计 前言&#xff1a;这篇博客在打开可能会自动播放视频&#xff0c;视频有音乐&#xff0c;请及时静音哈&#x1f642; 目录 ✨前言 ✨引言 ✨简单介绍一下Javaswing这项技术简单介绍一下Javaswing这项技术&a…

电子模块|压力传感器模块HX711---硬件介绍与C51STM32驱动

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 硬件模拟输入供电电源时钟选择串口通讯复位和断电HX711相关部分的 PCB 设计 软件驱动C51软件代码STM32软件代码 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A…

全志V3S嵌入式驱动开发(音频输出和音频录制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前在芯片公司的时候&#xff0c;基本没有看过音频这一块&#xff0c;只知道有个alsa框架这么个知识点。要驱动音频&#xff0c;需要两部分&#…

10-风险管理:如何应对暗礁风险?系统化风险管理让你安心!

项目已到中期&#xff0c;目前看很顺利&#xff0c;但隐隐不安&#xff1a;项目进展越平稳&#xff0c;我越觉不安。我担心项目会不会存在什么风险&#xff0c;而自己却没发现。 这种担心很必要&#xff0c;因为项目从构思起&#xff0c;就存在风险。光担心没用&#xff0c;项…

如何用LoadRunner 做性能测试?一篇文章教会你

目录 一、loadrunner介绍 二、测试计划 三、创建测试脚本 四、创建测试场景 五、分析结果 六、性能指标 一、loadrunner介绍 loadrunner有三个软件&#xff0c;其中Virtual User Generator是用于录制测试脚本的&#xff0c;是一个虚拟用户生成器。Controller用于创建、运…

CSS常用属性

目录 1.CSS是什么&#xff1f; 2.基本语法 3.引入方式 1.内部样式表 2.行内样式表 3.外部样式 4.基础选择器 1.标签选择器 2.类选择器 3.id选择器 4.通配符选择器 基础选择器总结 5.复合选择器 1.后代选择器 2.子选择器 3.并集选择器 4.伪类选择器 1) 链接伪类…

行业风向:国产新能源汽车如何“扬帆起航”闯世界?

历经十余年的积累和发展&#xff0c;受益于国家财政政策的大力支持、行业技术水平的大幅提升、车企研发与营销费用的大力投入等多重因素&#xff0c;我国新能源汽车走向了高速发展阶段&#xff0c;并一举成为全球最大的新能源汽车市场&#xff0c;在续航里程、环境适应性、整车…

Hooks

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版&#xff0c;配图更多&#xff0c;CSDN博文图片需要手动上传&#xff0c;因此文章配图较少&#xff0c;看不懂的可以去菜鸡博客参考一下配图&#xff01; 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

以太网交换机的生成树协议STP

以太网交换机的生成树协议STP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;以太网交换机的生成树协议STP 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 如下图所示以太网中出现链路故障导致部分主机间无法进行通信 如何提高以太网的可靠性&am…

Elasticsearch:复制 - replication

在本篇文章中&#xff0c;我们来讲述 Elasrticsearch 集群中重要的一个概念 replication&#xff0c;也即复制。 了解 Elasticsearch 中的分片复制 默认情况下&#xff0c;索引由单个分片组成&#xff0c;但是如果存储分片的节点出现故障&#xff08;例如磁盘故障&#xff09;…

【Python基础】- 基础数据类型(下)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

一文吃透Java并发高频面试题

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

typescript 相关概念

TypeScript 开发环境搭建 下载Node.js 14.15.1版本64位&#xff1a;https://nodejs.org/dist/v14.15.1/node-v14.15.1-x64.msi node官网&#xff1a; Node.js 安装Node.js 使用npm全局安装typescript 进入命令行 输入: npm i -g typescript 创建一个ts文件 使用tsc对ts文件…

从0-1一起学习live555设计思想之一 基础运行环境 + 任务调度

系列文章目录 文章目录 系列文章目录前言一、基础组件总览二、UsageEnvironment三、BasicUsageEnvironment0四、BasicUsageEnvironment五、TaskScheduler六、BasicTaskScheduler0七、DelayQueue八、BasicTaskScheduler九、基础调度总结总结前言 一、基础组件总览 本篇开始分析…

【OpenCV • c++】滑动条的创建和使用

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

【Linux网络服务】Nginx Rewrite重写模块

Nginx Rewrite 一、常用的Nginx 正则表达式二、location 匹配的范围2.1location实验 三、rewrite模块3.1rewrite跳转3.2rewrite执行顺3.3flag标记说明3.4rewrite中常用的全局变量3.5rewrite实验3.5.1 基于域名的跳转3.5.2基于客户端IP访问跳转3.5.3基于旧域名跳转到新域名后面加…

基于深度学习的高精度海洋生物检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度海洋生物检测识别系统可用于日常生活中检测与定位海洋生物目标&#xff08;海胆&#xff1a;echinus&#xff0c;海参&#xff1a;holothurian&#xff0c;扇贝&#xff1a;scallop&#xff0c;海星&#xff1a;starfish&#xff09;&…