Element-UI Table实现列表筛选数据及列表嵌套选择框

news2024/9/20 13:21:39

VUE 框架在 Element UI 的基础上,Table 组件中实现了列表数据的修改功能,支持单选和多选功能,并且列表具备筛选功能。样式如图所示。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

功能介绍

  • 点击table列名实现筛选查询功能
  • 相关性判断点击列表中的正方形实现选择框功能,同时修改列表数据
  • 其他标记点击列表实现复选框功能,列表样式根据选择数据的数量动态适应宽度。

功能实现

相关性判断类单选功能

  • 表头筛选功能
    在表头位置添加了一个 el-popover 弹出框,里面包含了 el-checkbox-group 用于选择不同的相关性判断选项。通过点击表头旁边的图标来打开弹出框并选择筛选条件。点击“查询”按钮时,将关闭弹出框,并执行查询逻辑。
  • 列表数据修改功能
    每行数据旁边都有一个 el-popover,其中包含可点击的不同相关性判断选项。当点击某个选项时,会更新该行数据的相关性判断,并发送请求到后端进行数据更新。
代码
<el-table-column width="60" prop="correlationJudgment">
    <!-- 列数据筛选功能 -->
    <template #header>
        <span class="top-header">相关性<br />判断
            <!-- 弹出框,用于显示相关性判断的选择 -->
            <el-popover 
                @show="correlationJudgmentshowPopover('相关性')" 
                @hide="correlationJudgmenthidePopover" 
                ref="correlationJudgmentPopover" 
                placement="bottom" 
                trigger="click" 
                popper-class="top-popover" 
                :popper-options="{ boundariesElement: 'viewport', removeOnDestroy: true }">
                
                <div class="genePopover-title">相关性判断</div>
                <div class="genePopover-box"> 
                    <div style="padding: 5px 15px">
                        <!-- 多选框组,用于选择相关性判断的选项 -->
                        <el-checkbox-group v-model="correlationJudgmentList">
                            <el-checkbox label="高度相关">高度相关</el-checkbox>
                            <el-checkbox label="其他可疑">其他可疑</el-checkbox><br>
                            <el-checkbox label="参考位点">参考位点</el-checkbox>
                            <el-checkbox label="热点突变">热点突变</el-checkbox><br>
                            <el-checkbox label=""></el-checkbox>
                        </el-checkbox-group>
                    </div>
                </div>
                <div class="popover-footer">
                    <!-- 取消按钮 -->
                    <div class="geneBtnCancel" @click="correlationJudgmentCancelBtn">
                        取消
                    </div>
                    <!-- 查询按钮 -->
                    <div class="geneBtnQuery" @click="correlationJudgmentQueryBtn">
                        查询
                    </div>
                </div>
                <!-- 弹出框的参考内容 -->
                <div slot="reference" class="determine">
                    <img src="../../../assets/images/筛选.png" class="top-img" alt="" v-if="correlationJudgmentList.length == 0" />
                    <img src="../../../assets/images/red.png" class="top-img1" alt="" v-else />
                </div>
            </el-popover>
        </span>
    </template>
    
    <!-- 列表数据修改显示 -->
    <template slot-scope="scope">
        <div class="determine-box">
            <!-- 每一行数据的弹出框 -->
            <el-popover 
                :ref="`popover-${scope.$index}`" 
                placement="left" 
                trigger="click" 
                :offset="30" 
                :popper-options="{ boundariesElement: 'viewport',removeOnDestroy: true }">
                
                <!-- 相关性判断的选项,每个选项都调用 getdetermine 方法 -->
                <div style="width: 100px;margin: 0;display: flex;justify-content: center;line-height: 2;" @click="getdetermine('高度相关', scope)">
                    高度相关
                </div>
                <div style="width: 100px;margin: 0;display: flex;justify-content: center;line-height: 2;" @click="getdetermine('其他可疑', scope)">
                    其他可疑
                </div>
                <div style="width: 100px;margin: 0;display: flex;justify-content: center;line-height: 2;" @click="getdetermine('参考位点', scope)">
                    参考位点
                </div>
                <div style="width: 100px;margin: 0;display: flex;justify-content: center;line-height: 2;" @click="getdetermine('热点突变', scope)">
                    热点突变
                </div>
                <div style="width: 100px;margin: 0;display: flex;justify-content: center;line-height: 2;" @click="getdetermine('无', scope)"></div>
                <!-- 显示当前行的相关性判断结果 -->
                <div slot="reference" class="determine">
                    {{ scope.row.correlationJudgment }}
                </div>
            </el-popover>
        </div>
    </template>
</el-table-column>
methods:{
   	//悬浮
    correlationJudgmentshowPopover (row) {
      this.titleContent = row;
    },
    //悬浮隐藏
    correlationJudgmenthidePopover () {

    },
    //悬浮取消
    correlationJudgmentCancelBtn () {
      this.$refs.correlationJudgmentPopover.doClose();
    },
    //悬浮查询
    correlationJudgmentQueryBtn () {
      this.pageSize = 10;
      this.pageNum = 1;
      this.getAllParams();
      this.$refs.correlationJudgmentPopover.doClose();
    },
    //选中数据
    getdetermine (val, row) {
      let oldcorrelationJudgment = row.row.correlationJudgment;
      if (val == "无") {
        row.row.correlationJudgment = "";
      }
      let params = {
        参数...
      };
      updateReport(params).then((res) => {
      	this.getList();
      });
      this.$refs[`popover-${row.$index}`].doClose();
      this.$forceUpdate();
    },
}
注释说明:
  • <el-table-column>: 定义表格的列,指定宽度和绑定的数据属性。
  • <template #header>: 自定义表头,包含一个弹出框用于选择相关性判断。
  • <el-popover>: 弹出框组件,用于显示选项和操作按钮。
  • <el-checkbox-group>: 用于多个复选框的分组,允许用户选择多个选项。
  • @click: 事件处理器,触发相应的方法。
  • slot-scope: 用于访问当前行数据(scope),使得每一行可以独立操作。

其他标记复选功能

  • 表头筛选功能
    类似地,在其他标记列的表头位置也添加了一个 el-popover 弹出框,用于选择不同的其他标记。可以选择多个标记,并通过点击“查询”按钮来执行筛选操作。
  • 列表数据修改功能
    每行数据旁边也有一个 el-popover,其中包含可选择的其他标记选项。可以选择或取消选择某些标记,然后当关闭弹出框时,会更新该行数据的其他标记,并发送请求到后端进行数据更新。
代码
<el-table-column width="90" prop="multipleRelevances">
    <!-- 自定义表头 -->
    <template #header>
        <span class="top-header">其他<br />标记
            <!-- 弹出框,用于选择其他标记 -->
            <el-popover 
                @show="multipleRelevanceshowPopover('相关性')" 
                @hide="multipleRelevancehidePopover" 
                ref="multipleRelevancePopover" 
                placement="bottom" 
                trigger="click" 
                popper-class="top-popover" 
                :popper-options="{ boundariesElement: 'viewport', removeOnDestroy: true }">
                
                <div class="genePopover-title">其他标记</div>
                <div class="genePopover-box">
                    <div style="padding: 5px 15px">
                        <!-- 多选框组,用于选择其他标记 -->
                        <el-checkbox-group v-model="multipleRelevanceList">
                            <el-checkbox label="自闭基因">自闭基因</el-checkbox>
                            <el-checkbox label="次要发现">次要发现</el-checkbox><br>
                            <el-checkbox label=""></el-checkbox>
                        </el-checkbox-group>
                    </div>
                </div>
                <div class="popover-footer">
                    <!-- 取消按钮 -->
                    <div class="geneBtnCancel" @click="multipleRelevanceCancelBtn">
                        取消
                    </div>
                    <!-- 查询按钮 -->
                    <div class="geneBtnQuery" @click="multipleRelevanceQueryBtn">
                        查询
                    </div>
                </div>
                <!-- 弹出框的参考内容 -->
                <div slot="reference" class="determine">
                    <img src="../../../assets/images/筛选.png" class="top-img" alt="" v-if="multipleRelevanceList.length == 0" />
                    <img src="../../../assets/images/red.png" class="top-img1" alt="" v-else />
                </div>
            </el-popover>
        </span>
    </template>

    <!-- 列表数据修改显示 -->
    <template slot-scope="scope">
        <div class="determine-box">
            <el-popover 
                @hide="multipleRelevanceHide(scope)" 
                @show="multipleRelevanceClick(scope)" 
                :ref="`popover-${scope.$index}`" 
                placement="left" 
                trigger="click" 
                :offset="30" 
                :popper-options="{ boundariesElement: 'viewport',removeOnDestroy: true }">
                
                <div style="width: 100px;margin-left: 20px;display: flex;justify-content: center;line-height: 2;">
                    <!-- 多选框组,用于选择其他标记 -->
                    <el-checkbox-group v-model="multipleRelevances" @change="handleMultipleRelevanceChange">
                        <el-checkbox label="自闭基因">自闭基因</el-checkbox>
                        <el-checkbox label="次要发现">次要发现</el-checkbox>
                    </el-checkbox-group>
                </div>
                <!-- 弹出框的参考内容,通过数据量动态显示样式宽度 -->
                <div slot="reference" class="determine" :style="'width: '+(scope.row.multipleRelevances && scope.row.multipleRelevances.length > 1 ? 60 : 30) + 'px;'">
                    <span v-for="relevance in scope.row.multipleRelevances" :key="relevance">
                        {{ relevance }}
                    </span>
                </div>
            </el-popover>
        </div>
    </template>
</el-table-column>
注释说明:
  • <el-table-column>: 定义表格的列,指定宽度和绑定的数据属性。
  • <template #header>: 自定义表头,包含一个弹出框用于选择其他标记。
  • <el-popover>: 弹出框组件,用于显示选项和操作按钮。
  • <el-checkbox-group>: 用于多个复选框的分组,允许用户选择多个选项。
  • @click: 事件处理器,触发相应的方法。
  • slot-scope: 用于访问当前行数据(scope),使得每一行可以独立操作。
methods:{
   	//悬浮
    multipleRelevanceshowPopover (row) {
      this.titleContent = row;
    },
    //悬浮隐藏
    multipleRelevancehidePopover () {

    },
    //悬浮取消
    multipleRelevanceCancelBtn () {
      this.$refs.multipleRelevancePopover.doClose();
    },
    //悬浮查询
    multipleRelevanceQueryBtn () {
      this.pageSize = 10;
      this.pageNum = 1;
      this.getAllParams();
      this.$refs.multipleRelevancePopover.doClose();
    },
    //选中数据,进行修改
    multipleRelevanceHide (row) {
      let multipleRelevanceStr = JSON.parse(JSON.stringify(this.multipleRelevances));
      this.multipleRelevances = [];
      let multipleRelevance = multipleRelevanceStr.join(',')
      let oldmultipleRelevance = row.row.multipleRelevance;
      let params = {
        参数...
      };
      updateReport(params).then((res) => {
        this.getList(); 
      });
      this.$refs[`popover-${row.$index}`].doClose();
      this.$forceUpdate();
    },
    //点击时获取数据用于复选框数据回显
    multipleRelevanceClick (row) {
      this.multipleRelevances = row.row.multipleRelevances
    },
    //选中的数据
    handleMultipleRelevanceChange (value) {
      this.multipleRelevances = value
    },
}

页面样式

<style lang="scss">
@import "../../../assets/styles/index.scss";

.el-popover {
  min-width: 100px;
  padding: 0;
  // left: 8px !important;
  font-size: 12px;

  .genePopover-title {
    padding: 0 10px;
    width: 100%;
    background-color: var(--topPopover);
    color: #ffffff;
    height: 30px;
    line-height: 30px;
    border-radius: 4px 4px 0 0;
  }

  .genePopover-box {
    padding: 8px;
    border-bottom: 1px solid #d0d0d0;

    .el-textarea__inner {
      font-size: 13px;
    }

    .title-info {
      padding: 5px 0;
    }
  }

  .genePopover-box {
    max-width: 300px !important;
  }

  .popover-footer {
    display: flex;
    justify-content: flex-end;
    padding: 8px;
    line-height: 1;

    .geneBtnCancel {
      padding: 4px 8px;
      border: 1px solid #d0d0d0;
      border-radius: 3px;
      margin-right: 10px;
    }

    .geneBtnQuery {
      padding: 4px 8px;
      border-radius: 3px;
      background-color: var(--topPopover);
      color: #ffffff;
    }
  }

  .numberOfCasesPopover {
    display: flex;
    align-items: center;
    padding-top: 10px;
    padding-bottom: 20px;

    .el-input--medium .el-input__inner {
      height: 30px;
      line-height: 30px;
    }
  }

  .el-checkbox {
    margin-right: 10px;

    .el-checkbox__label {
      padding-left: 5px;
      font-size: 12px;
    }
  }

  .el-checkbox__input.is-checked .el-checkbox__inner {
    background-color: var(--checkboxColor);
    border-color: var(--checkboxColor);
  }

  .el-checkbox__input.is-checked + .el-checkbox__label {
    color: var(--checkboxColor);
  }

  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
    background-color: var(--checkboxColor);
    border-color: var(--checkboxColor);
  }

  .el-input--medium .el-input__inner {
    height: 30px;
    line-height: 30px;
  }
  .el-input__suffix {
    top: -3px;
  }
  .el-textarea__inner {
    padding-bottom: 15px;
  }

  .el-textarea .el-input__count {
    color: #909399;
    background: #ffffff;
    position: absolute;
    font-size: 12px;
    bottom: 2px;
    right: 20px;
    line-height: 1;
  }
}

.top-popover[x-placement^="bottom"] {
  margin-top: 21px;
  margin-left: 5px;
}

.top-popover[x-placement^="bottom"] .popper__arrow::after {
  border-bottom-color: var(--topPopover) !important;
}

.SNPInDel {
  .el-textarea__inner {
    padding-bottom: 15px;
  }

  .el-table {
    font-size: 12px;
    .el-table__header-wrapper {
      border-radius: 5px 5px 0 0;
    }
    .el-table__header-wrapper,
    .el-table__fixed-header-wrapper {
      th {
        word-break: break-word;
        background-color: #e3e8f1;
        color: #515a6e;
        height: 20px;
        font-size: 12px;
        font-weight: bold;
        padding: 3px 0;
      }
    }

    .el-table__body-wrapper {
      .el-button [class*="el-icon-"] + span {
        margin-left: 1px;
      }
    }

    .el-table--medium .el-table__cell {
      padding: 10px !important;
    }

    .cell {
      padding: 0 !important;
      line-height: 1.1;
      // height: 100%;
      display: flex;
      flex-direction: column;

      p {
        margin: 0 !important;
        height: 100%;
        display: flex;
        justify-content: flex-start;
        align-items: center;
        width: 100%;
      }

      .el-icon-s-open:before {
        content: "";
        color: var(--color);
      }

      .determine-box {
        .determine {
          font-size: 12px;
          display: flex;
          justify-content: center;
          width: 30px;
          // height: 30px;
          min-height: 30px;
          align-items: center;
          color: var(--color);
          background-color: #c4e8ff;
          border: 1px dashed var(--color);
          border-radius: 2px;
          padding: 1px;
          cursor: pointer;
        }
        .determines {
          font-size: 12px;
          display: flex;
          justify-content: center;
          width: 30px;
          // height: 30px;
          min-height: 30px;
          align-items: center;
          color: var(--color);
          background-color: #c4e8ff;
          border: 1px dashed var(--color);
          border-radius: 2px;
          padding: 1px;
          cursor: pointer;
        }
      }
  
    }

    .top-header {
      position: relative;
      height: 40px;
      display: flex;
      align-items: center;

      .top-img {
        position: absolute;
        width: 12px !important;
        bottom: 3px;
        cursor: pointer;
      }
      .top-img1 {
        position: absolute;
        width: 12px !important;
        bottom: 3px;
        cursor: pointer;
      }
    }
  }
}
</style>

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

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

相关文章

设计模式-创建型模式-建造者模式

1.建造者模式定义 建造者模式又称生成器模式&#xff0c;将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示&#xff1b; 1.1 建造者模式优缺点 优点 封装性好&#xff0c;主要的业务员逻辑封装在指挥者类中&#xff1b;客户端不必知道产品内…

RabbitMQ练习(Work Queues)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》 确保RabbitMQ、Sender、Receiver容器正常安装和启动&#xff1a; rootk0test1:~# docker run -it --rm --…

流体中的流线【StreamLines】的实现

流线是一条线&#xff0c;它是 与瞬时速度方向相切&#xff08;速度是一个矢量&#xff0c;并且 它有一个大小和一个方向&#xff09;。为了在流程中可视化这一点&#xff0c;我们 可以想象一个小的标记流体元素的运动。例如&#xff0c;我们可以标记一个 用荧光染料滴水&#…

nginx和tomcat负载均衡

文章目录 一&#xff0c;tomcat1.tomca用途2.tomcat重要目录 二&#xff0c;nginx1.Nginx应用2.nginx作用3.nginx的正向代理和反向代理3.1正向代理3.2反向代理(单级)3.3反向代理(多级) 4.nginx负载均衡4.1Nginx支持的常见的分流算法1. 轮询(Round Robin):2.最少连接数(LeastCon…

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变 引言 OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。 至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的&#xff0c;找到了图片识别Excel表格的&#xff0c;有的找图片识别Excel表格的&#xff0c;找到了PDF发票提取表格的&#xff0c;所以就很难搞&#xff0c;还有的说都想要 今天一篇文章&#xff0c;全部搞定所有发票【电子发票&#x…

运维学习————nginx3-keepalived及高可用nginx集群

目录 一、高可用nginx规划图 二、克隆一个nginx 启动测试 ​编辑 三、keepalived简介 四、安装配置keepalived保活nginx 4.1、安装 ​编辑 4.2、配置 4.2.1、主机配置&#xff08;nginx1(主)配置&#xff09; 4.2.2、从机配置&#xff08;nginx2(主)配置&#xff09;…

敏捷架构框架:数字化转型的核心驱动力

在数字化转型的浪潮中&#xff0c;传统的企业架构和组织结构正面临严峻挑战。为了在快速变化的市场环境中保持竞争力&#xff0c;企业不仅需要灵活的开发流程&#xff0c;还需要一种能够支持敏捷方法的架构体系。《数字化时代的敏捷架构》提出的敏捷架构框架&#xff08;Agile …

建筑物规则化(实现) --- 特征边分组、重构、直角化

规则化建筑物 一、摘 要 建筑物多边形在地图综合中的两类处理模型:化简与直角化。 建筑物矢量数据来源广泛&#xff0c;在数据获取过程中&#xff0c;受GPS精确度、遥感影像分辨率或人为因素的影响&#xff0c;数据往往存在不同程度的误差。其中&#xff0c;图像分割、深度学习…

规范化JavaBean

Java Bean 是一个很常见的概念&#xff0c;简单来说就是一个 Java 类&#xff0c;其中的内容就是各种属性&#xff0c;以及各个属性的 getter/setter 。例如&#xff1a; class Student {private String name;private int age;public String getName() {return this.name;}pub…

网络协议与Netty

1、讲一讲什么是RPC&#xff1f; 说到RPC就必须要聊一聊单体项目和分布式/微服务项目 单体项目时&#xff1a;一次服务调用发生在同一台机器上的 同一个进程内部 &#xff0c;也就是说调用发生在本机内部&#xff0c;因此也被叫作本地方法调用。 分布式/微服务项目时&#x…

负载均衡:定义与核心作用

负载均衡&#xff1a;定义与核心作用 一、负载均衡的定义二、负载均衡的核心作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 负载均衡&#xff0c;作为网络技术的重要一环&#xff0c;对优化资源利用和提升服务器响应速度至关重要。本文…

Ps:首选项 - 界面

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为&#xff0c;从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率&#xff0c;减轻眼…

快速带你玩转高性能web服务器

目录 一.Web 服务基础介绍 ​编辑1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache的图标 1.2.2 NGINX的图标&#xff1a; 1.2.3 Apache 经典的 Web 服务端 1.2.3.1 Apache prefork 模型 1.2.3.2 Apache worker 模型 1.2.3.3 Apache event模型 1.2.4 Nginx-高性能的 Web …

PanDownload 网页复刻版最新PHP源码

源码介绍 PanDownload 网页复刻版&#xff0c;PHP语言版&#xff0c;PanDownload在线解析下载的优点&#xff0c;速度快&#xff0c;受用户自身带宽限制&#xff0c;就是说你的宽度交多少决定你下载的速度&#xff0c;不用下载百度网盘客户端&#xff0c;你可以直接使用解析所…

PingCAP 携手 CCF 数据库专委会打造“开源数据库领域拔尖创新人才培育计划”,共塑数据库教育未来丨NDBC 2024

2024 年 8 月 7 日 - 10 日&#xff0c;由中国计算机学会主办、中国计算机学会数据库专业委员会和新疆大学承办、新疆 IT 三会等单位协办的第 41 届中国数据库学术会议&#xff08;NDBC 2024&#xff09;在新疆乌鲁木齐成功举办。 大会上 PingCAP 联合创始人黄东旭发表了主题演…

LabVIEW深度监测系统

随着果园机械化作业的迅速发展&#xff0c;传统的人工监测方式已难以满足现代农业的高效率与精准性需求。本文介绍了一种基于LabVIEW软件的果园开沟深度监测系统&#xff0c;该系统通过集成先进的传感技术与数据处理算法&#xff0c;实现了对开沟深度的实时精确监测和自动控制&…

11.SPI通信

SPI理论 常规四线&#xff1a;SCLK、CS、MOSI(主向从发)、MISO(从向主发) 同步、串行、全双工、速率(MHz) 一主一从、一主多从、不能多主 工作模式&#xff1a; CPOL 0&#xff1a;总线空闲状态时钟为低电平&#xff0c;1&#xff1a;总线空闲状态时钟为高电平 CPHA 0&#…

【Python系列】执行 Shell 命令的六种方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

0.91寸OLED迷你音频频谱

一、简介 音频频谱在最小0.91寸OLED 屏幕上显示&#xff0c;小巧玲珑 二、应用场景 本模块为音频频谱显示模块&#xff0c;用来获取声音频谱并展示频谱&#xff0c;跟随音乐声音律动 三、产品概述 基于主控芯片设计的将声音采集分析频谱&#xff0c;显示到0.91寸OLED的功能…