产品说这个 table 这里数据需要合并

简介: 产品说这个 table 这里数据需要合并

前言

项目中的某个模块,一个勾选表格数据,里面的行数据由于有关联关系,需要多行数据合并,然后勾选时选中一条数据,方便进行下一步业务操作,然后产品经理就指着原型上的表格,说:这里,这里, 数据需要合并......

功能需求有了,里面有个技术实现点 —— 表格数据合并,下面我们就来分析一下这个表格数据合并的实现

思路梳理

方案一 Element 官方 Table 组件数据合并

由于项目用的 Element UI 库, Table 表格 组件刚好有现成的功能,官方还提供了 Demo,代码复制过来直接改一下放到项目,这不还简单


直接翻到 Element UI Table 组件数据合并位置看官方案例,发现里面用了一个 span-method 属性

span-method 合并行或列的计算方法 Function({ row, column, rowIndex, columnIndex })

通过如下方式处理合并行或者列

<el-table
  border
  ref="multipleTable"
  :data="tableData"
  tooltip-effect="dark"
  style="width: 800px; margin: 10px 0"
  @selection-change="handleSelectionChange"
  :span-method="objectSpanMethod"
></table>
methods: {
  objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
    if (columnIndex === 0) {
      if (rowIndex % 2 === 0) {
        return {
          rowspan: 2,
          colspan: 1
        }
      } else {
        return {
          rowspan: 0,
          colspan: 0
        }
      }
    }
  }
}
通过这个函数控制 rowspancolspan 来实现合并,但是分析数据结构的时候发现两个点
  1. 这种方案的数据是多条数据合并成一行渲染的方式
  2. 多行数据合并后,选中行的效果还是一行一行的,不同行的选中效果不一样

image.png

实际项目中数据格式是这样的,表格行有对应的ID,每行数据超过20列,每列内容部分可能还比较多,如下例子

[
  {
    id: '1',
    date: '2016-05-03',
    name: '张三',
    address: '家庭地址:上海市普陀区金沙江路'
  },
  {
    id: '1',
    date: '2016-05-03',
    name: '张三',
    address: '公司地址:北京市朝阳区金台路'
  },
  {
    id: '2',
    date: '2016-05-02',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 '
  }
]

按照这种方式的话,每次请求后端都需要返回大量数据,性能不是很好;不同的列字段还需要动态处理表格单元格的合并, span-method 里面的逻辑得写一大坨, 这个表格合并方案在当前项目中用不是很友好

注意

Demo 里面的是静态数据,如果是动态比较id的合并的方式, span-method 里面逻辑需要单独处理。网上有很多动态对比ID数据实现数据行合并的实现,按需搜索即可,文章下面也提供了两个实现参考链接

那还有更好的实现方案吗?

方案二 Table-column Scoped Slot

首先要满足合并行是一条数据,需要多行展示的数据通过 Table-column Slot 实现,写个循环动态展示数据,如下数据格式

[
  {
    id: '1',
    date: '2016-05-03',
    name: '张三',
    address: ['家庭地址:上海市普陀区金沙江路', '公司地址:北京市朝阳区金台路']
  },
  {
    id: '2',
    date: '2016-05-02',
    name: '王小虎',
    address: ['上海市普陀区金沙江路 1518 ']
  },
  {
    id: '3',
    date: '2016-05-02',
    name: '李四',
    address: ['广州市xxx区']
  }
]

例如需要多行展示的列为 address, 后端返回的格式为一个数组直接遍历使用 div 渲染

<el-table-column
  label="地址"
>
  <template slot-scope="scope">
    <div
      style=""
      v-for="(item, index) in scope.row.address"
      :key="index"
    >
        {{ item }}
    </div>
  </template>
</el-table-column>

得到如下效果

image.png

这时候并不是一个多行数据合并的效果,给 div 加个 border-bottom 样式,顺便处理一下渲染时的最后一个 div不加 border

<el-table-column
  label="地址"
  class-name="cell-control-type"
  label-class-name="cell-control-title"
>
  <template slot-scope="scope">
    <div
      style=""
      v-for="(item, index) in scope.row.address"
      :key="index"
    >
    <div
      v-if="index === scope.row.address.length - 1"
      style=""
    >
      {{ item }}
    </div>
    <div
      v-else
      style="border-bottom: 1px solid #ebeef5;"
    >
      {{ item }}
    </div>
    </div>
  </template>
</el-table-column>

image.png

这时候的表格列有边距问题,看起来还不是一个合并的表格行,接下来我们看下表格内置的边距控制

image.png

通过分析 Table 的源码,需要把对应的列的内置 padding 属性去掉,然后让循环遍历数据的 div 宽度充满表格单元格,这时候再给循环遍历的 div 添加对应的边距,去除 Element Table 内置 cell 样式的时候再对应的列上添加了一个自定义 class 类 —— cell-control-type,这里用来修改 address 当前列的样式,而不影响其他列

由于移除整个列的 padding, 列头标题位置也受影响了,使用 label-class-name 属性把列 titlemargin-left 设置一下,就和原生效果一样了

<el-table-column
  label="地址"
  class-name="cell-control-type"
  label-class-name="cell-control-title"
>
  <template slot-scope="scope">
    <div
      style=""
      v-for="(item, index) in scope.row.address"
      :key="index"
    >
      <div
        v-if="index === scope.row.address.length - 1"
        style="padding: 10px"
      >
        {{ item }}
      </div>
      <div
        v-else
        style="border-bottom: 1px solid #ebeef5; padding: 10px"
      >
        {{ item }}
      </div>
    </div> 
  </template>
</el-table-column>
<style>
.cell-control-type {
  padding: 0 0 !important;
}
.cell-control-title {
  margin-left: 10px;
}
.cell-control-type .cell {
  padding: 0 0 !important;
}
</style>

看一下调整后的完整效果,这时候看起来合并效果还不错,也满足产品经理的需求了

image.png

注意

修改 Element 原生样式的时候需要写到全局 <style> 中,否则样式修改无效

修改UI库组件源码的时候需要注意当前的样式修改是否影响了其他 .vue 页面的实现效果,尤其公共组件统一修改的时候

小技巧

可以通过给需要修改的组件添加个一个自定义的 class 类,例如修改 Table 组件可以如下写法

.custom-class .table {}

参考链接

  • Element UI Table 合并行或列
  • Element UI Table 动态合并行或列

代码地址

写在最后

文章实现方案基于实际项目需求进行分析,不同的需求场景可能有不同的实现方案,关于表格合并实现方案如果有其他实现方式,欢迎大家评论区讨论交流,一起学习共同进步 ^-^

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿

目录
相关文章
|
7月前
|
分布式计算 关系型数据库 数据挖掘
实时数仓 Hologres产品使用合集之当使用动态分区管理功能按日期进行分区后,通过主键和segment_key进行时间范围查询性能变差是什么原因
实时数仓Hologres的基本概念和特点:1.一站式实时数仓引擎:Hologres集成了数据仓库、在线分析处理(OLAP)和在线服务(Serving)能力于一体,适合实时数据分析和决策支持场景。2.兼容PostgreSQL协议:Hologres支持标准SQL(兼容PostgreSQL协议和语法),使得迁移和集成变得简单。3.海量数据处理能力:能够处理PB级数据的多维分析和即席查询,支持高并发低延迟查询。4.实时性:支持数据的实时写入、实时更新和实时分析,满足对数据新鲜度要求高的业务场景。5.与大数据生态集成:与MaxCompute、Flink、DataWorks等阿里云产品深度融合,提供离在线
|
8月前
|
SQL 资源调度 Oracle
实时计算 Flink版产品使用合集之是否支持通过 TRUNCATE TABLE 语句来截断(truncate)表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之删除dws层的数据会把dwd的数据删除掉吗
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
57 0
|
6月前
|
Kubernetes 关系型数据库 MySQL
实时计算 Flink版操作报错合集之一张大表主键是多个字段组成的,按第一个主键的column划分出现了数据倾斜,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
7月前
|
分布式计算 DataWorks 大数据
MaxCompute产品使用合集之查询优化中对使用concat函数拼接起来的分区字段进行查询时,能否进行分区剪枝
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
8月前
|
安全 Java 数据库连接
实时数仓 Hologres产品使用合集之如果在映射中台表的时候ds被勾选为了字段,可以在分区信息那一页中直接写入 PARTITIONED BY (ds) 吗
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
8月前
|
SQL 分布式计算 DataWorks
实时数仓 Hologres产品使用合集之查询分区表的生命周期(即之前设置的'auto_partitioning.num_retention'值)的SQL语句,可以使用什么查询
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
130 0
|
8月前
|
存储 前端开发 Oracle
物化视图添加删除列测试
物化视图添加删除列测试
55 2
|
8月前
|
SQL 数据库
Doris将查询的结果数据直接insert到另一个表的语法
【4月更文挑战第20天】Doris将查询的结果数据直接insert到另一个表的语法
580 0
|
8月前
|
小程序
06 - table表格标签+ 行合并+列合并
06 - table表格标签+ 行合并+列合并
142 0