首页 > 其他分享 >对支持全选的el-table进行筛选并且与另一个table进行数据关联

对支持全选的el-table进行筛选并且与另一个table进行数据关联

时间:2024-08-15 10:58:08浏览次数:19  
标签:el selection length 全选 deviceId query table row selectedData

效果图

​​在这里插入图片描述
在这里插入图片描述

代码

弹窗代码

<!-- 弹窗组件 -->
          <el-dialog title="选择设备" :visible.sync="dialogVisible" width="50%">
            <div class="table-container">
              <div style="display: flex; gap: 20px; overflow: auto">
                <small style="width: 10%; margin-top: 17px; margin-left: 20px">
                  设备名称:</small
                >
                <el-input
                  v-model="query.searchQuery"
                  placeholder="搜索设备"
                  style="margin-bottom: 20px; margin-top: 10px; width: 30%"
                /><span style="margin-top: 20px"
                  >已选择{{ this.query.selectedData.length }}台设备</span
                >
              </div>

              <div
                style="display: flex; gap: 20px; height: 300px; overflow: auto"
              >
                <!-- 第一个表格,显示所有数据 -->
                <el-table
                  ref="myTable"
                  :data="filteredData"
                  @select-all="handleSelectAll"
                  @selection-change="handleSelectionChange"
                  style="width: 50%; margin-left: 50px"
                >
                  <el-table-column type="selection" width="55">
                  </el-table-column>
                  <el-table-column
                    prop="deviceName"
                    label="设备名称"
                    width="150"
                  >
                  </el-table-column>
                </el-table>

                <!-- 第二个表格,显示选中的数据 -->
                <el-table
                  :data="query.selectedData"
                  style="width: 50%; margin-left: 50px"
                >
                  <el-table-column
                    prop="deviceName"
                    label="设备名称"
                    width="150"
                  >
                  </el-table-column>
                  <el-table-column label="操作" min-width="50" >
                    <template slot-scope="{ row }">
                      <el-button
                        type="danger"
                        icon="el-icon-delete"
                        @click="removeDevice(row.deviceId)"
                        circle
                      ></el-button>
                    </template>
                  </el-table-column>
                </el-table>
              </div>
            </div>

            <div slot="footer" class="dialog-footer">
              <el-button @click="dialogVisible = false">取消</el-button>
              <el-button type="primary" @click="confirmSelection"
                >确定</el-button
              >
            </div>
          </el-dialog>

js代码

data() {
    return {
      dialogVisible: false,
      msg: "未选择设备,默认查询全部设备",
      query:{
              ids: [],
              count: 10,
              startTempTime: "",
              searchQuery: "",
              selectedData: [],      
              }
           }
      },
  computed: {
    filteredData() {
      return this.list.filter((item) =>item.deviceName.includes(this.query.searchQuery)
      );
    },
  },
  methods: {
      handleSelectAll(selection) {
      if (selection.length == 0 && this.query.searchQuery == "") {
        //  this.query.selectedData=[]
        this.query.selectedData = [];
        return;
      }
      console.log("全选操作,当前选中的所有行:", selection);
    },
    // 监听第一个表格的选择事件
    handleSelectionChange(selection) {
      if (selection.length == 0 && this.query.searchQuery == "") {
        if (this.query.selectedData.length == 1) {
          this.query.selectedData = [];
        }
        this.restoreSelection();
        return;
      }
      if (
        selection.length == 0 &&
        this.query.searchQuery != "" &&
        this.query.selectedData.length > 0
      ) {
        this.restoreSelection();
        return;
      }
      
      // 获取 filteredData 中不在 selection 中的元素
      const difference1 = this.filteredData.filter(
        (x) => !selection.includes(x)
      );
      const set = new Set(this.query.selectedData);
      // this.query.selectedData = selection;
      var ids = [];
      selection.forEach((element) => {
        ids.push(element.deviceId);
        set.add(element);
      });

      var newList = Array.from(set);
      this.query.selectedData = newList.filter((x) => !difference1.includes(x));
      this.restoreSelection();
      this.query.ids = ids;
    },
    // 确认选择
    confirmSelection() {
      if (this.query.selectedData.length != 0) {
        this.msg = "已选择" + this.query.selectedData.length + "台设备";
      }
      this.dialogVisible = false;
    },
     removeDevice(deviceId) {
      this.query.selectedData = this.query.selectedData.filter(
        (row) => row.deviceId !== deviceId
      );
      const row = this.filteredData.find((row) => row.deviceId === deviceId);
      if (row) {
        this.$refs.myTable.toggleRowSelection(row, false); // 取消选中
      }
    },
    restoreSelection() {
      this.$nextTick(() => {
        this.query.selectedData.forEach((row) => {
          this.$refs.myTable.toggleRowSelection(row, true);
        });
      });
    },            
}
(小小的说明一下,我不是专门搞前端的,前端水平有限,就是需要实现这个功能,但是没找到满足需求的,就只能自己写啦,可能写的一坨哈哈哈哈,但是还是满足需求了,需要的话可以参考一下下哈哈哈哈)

标签:el,selection,length,全选,deviceId,query,table,row,selectedData
From: https://blog.csdn.net/qq_50134188/article/details/141216622

相关文章

  • 在K8S中,Kube-Proxy为什么使用ipvs,而不使用iptables?
    Kubernetes中的kube-proxy是负责实现服务(Services)负载均衡的核心组件之一。它支持两种主要的代理模式:iptables模式和ipvs模式。这两种模式都可以用来实现服务的网络流量转发,但它们之间存在一些关键的区别。1.为什么使用ipvs而不是iptables?性能优势:连接跟踪:ipvs直......
  • Walmart之获取订单(SellerFulfilled、WFSFulfilled)
    API地址CA:https://developer.walmart.com/api/ca/mp/orders#operation/getAllOrdersUS:https://developer.walmart.com/api/us/mp/orders#operation/getAllOrders一、建立请求实体与响应实体类(CA和US站点相差不大)请求实体@DatapublicclassWmGetOrderRequest{/......
  • day02(Linux)Shell脚本
    Shell脚本一.shell脚本基础概念1.1概念shell使用方式:手动在命令行下命令和用shell脚本shell脚本本质:shell命令的有序集合,扩展名可以为sh见名知意,也可以没有。shell既是应用程序,又是一种脚本语言(应用程序解析脚本语言)。解释型语句:不需要编译,解释一条执行一条,pytho......
  • 040.Vue3入门,在Vue3中引入ElementUI
    1、npminstallelement-plus--save,安装UI 2、main.js代码如下://import'./assets/main.css'//引入下面这两行importElementPlusfrom'element-plus'import'element-plus/dist/index.css'import{createApp}from'vue'importApp......
  • Electron 的contextBridge
    contextBridge是Electron框架中用于在渲染器进程(通常是Web页面)和主进程之间安全地暴露API的一种方式。它允许开发者在保持主进程和渲染器进程之间清晰分离的同时,从主进程向渲染器进程安全地传递方法和属性。这是通过创建一个单向的、只能从主进程到渲染器进程的桥接......
  • 视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库
            ch3中的所有代码,除了在kdevelop中运行,还可以在VScode中运行。下面将简要演示配置过程,代码不再做解答,详细内容在下面的文章中。(这一节中的pangolin由于安装过程中会出现很多问题,且后续内容用不到该平台,所以暂时不进行安装)视觉SLAMch3—三维空间的刚体运动http......
  • PowerShell快速修改多个文件的名称
      本文介绍基于PowerShell语言,对文件夹中全部文件的名称加以批量替换、修改的方法。  在之前的文章中,我们介绍了基于Python语言,批量修改大量文件的名称的方法。当时我们修改文件名的需求比较复杂,因此选择了用Python语言来实现;而在我们的需求重命名规则相对比较简单时,则可以基......
  • SO-Net: Self-Organizing Network for Point Cloud Analysis
    Abstract本文提出了SO-Net,是一种创新的深度学习架构,为处理无序点云数据设计。SO-Net利用自组织映射(SOM)技术来捕捉点云的空间分布,并实现排列不变的特征提取。这种分层特征提取方法能够从局部到全局提取特征,还能够通过点到节点的k最近邻搜索系统地调整网络的receptivefield,从......
  • 第一阶段复习 --Python、Linux、Shell、MySQL
    文章目录第一阶段复习总结python1.python是面向对象的解释型动态数据语言的高级程序设计语言2.变量3.基础数据类型4.数据类型之间的转换5.str类型字符串方法序列6.运算符7.选择循环结构8.数据容器9.函数参数10.类11.正则12.文件读写13.异常处理tryexc......
  • 使用diffusers来训练自己的Stable Diffusion 3大模型
    基于diffusers的Stablediffusion训练代码这里给大家介绍一个基于diffusers库来训练stablediffusion相关模型的训练代码,包含Lora、ControlNet、IP-adapter、Animatediff,以及最新的stablediffusion3lora版本的训练代码。现有的一些类似kohya-ss训练器虽然用起来方便,但......