Wiidede's blog Wiidede's blog
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)

Wiidede

小的的写前端
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)
  • 整理一些css样式
  • vue隔代组件层层动态插槽并且附带数据
  • vue判断字符串是否溢出来显示弹窗、解决el-table tooltip 内过多导致无法显示,内容闪烁
  • 整理一些js写法
  • ElementUI timePicker 增加此刻按钮 引发的dom操作的学习
  • 毕业设计(水表识别)前端知识整理
  • html小知识
  • axios请求api然后下载文件
  • vue3+ts根据高度改变元素的透明度
  • vue3 + ElementPlus 换肤方案(Css变量)
  • Moment的一些使用方法
  • echarts基础vue组件
  • element UI el-date-picker 年月日切换组件
  • 可以不选择的el-radio单选框
  • vue的小技巧总结
  • 全局动态权限判断(Vue指令)
  • vue-anchor 探索
  • Deep Dive with Evan You 笔记
  • 前端基础知识查漏补缺
  • WebPack 知识总结
  • 我写的一些可以日后参考的代码
  • 接口变化后,封装接口函数,改变返回内容
  • 项目组件整理
  • 前端框架设计想发
  • 全局进度条
  • 带有token的图片vue组件:authImg,使用axios下载图片
  • 前端npm包推荐
  • 给ElInputNumber添加prefix
  • ElPagination添加页数总数
  • el-tab做成chrome类似的tab样式
  • vue-grid-layout-组件配置
  • 项目数据字典封装
  • 图表组件响应式探索
  • ElementPlus表格table列自动合并composition
    • 扩展
  • 简单的curd组件封装
  • ElementPlus表格自定义合计列composition
  • 一些处理表格数据composition api
  • div内容溢出后,内容向左悬浮,vue组件封装
  • 文本数字溢出后,按比例缩小,vue组件封装
  • 表格使用async-validator检验composition
  • ElementPlus Form一些简单的组件整合
  • arco-design快速使用tailwind的颜色、unocss动态颜色
  • 前端
wiidede
2022-12-31

ElementPlus表格table列自动合并composition

# ElementPlus表格table列自动合并composition

特性:

  1. 提供表格数据,需要合并的列的props,返回element plus table用的合并方法
  2. 数据更改后,合并应该也会随之自动更新
export const useColumnSpan = <Data>(tableData: Data[], keys: (keyof Data)[]) => {
  const getSpanNumber = (data: Data[], prop: keyof Data) => {
    const arrNumber = data.reduce(
      (prev, next) => {
        if (prev.currIndex > 0) {
          if (prev.name && prev.name === next[prop]) {
            prev.number[prev.nameIndex] += 1;
            prev.number[prev.currIndex] = 0;
          } else {
            prev.name = next[prop];
            prev.nameIndex = prev.currIndex;
            prev.number[prev.currIndex] = 1;
          }
        }
        prev.currIndex += 1;
        return prev;
      },
      {
        currIndex: 0,
        number: [1],
        nameIndex: 0,
        name: data[0][prop],
      },
    );
    return arrNumber.number;
  };

  const spanNumber = computed(() => {
    const map = new Map<keyof Data, number[]>();
    keys.forEach((key) => {
      map.set(key, getSpanNumber(tableData, key));
    });
    return map;
  });

  const spanMethod = ({ row, column, rowIndex, columnIndex }: SpanMethodProps<Data>) => {
    const prop = column.property as keyof Data;
    if (keys.includes(prop)) {
      const span = spanNumber.value.get(prop);
      return [span?.[rowIndex] ?? 1, 1];
    }
    return [1, 1];
  };

  return {
    spanNumber,
    spanMethod,
  };
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

# 扩展

有些时候,需要根据一个主键去合并表格上的几列,就可以再套一层composition api了

export const useColumnSpanMapping = <Data>(tableData: Ref<Data[]> | Data[], key: keyof Data, mapping: (keyof Data)[]) => {
  const { spanNumber, spanMethod } = useColumnSpan(tableData, [key]);
  const columnSpan = ({ row, column, rowIndex, columnIndex }: SpanMethodProps<Data>) => {
    const prop = column.property as keyof Data;
    if (mapping.includes(prop)) {
      const span = spanNumber.value.get(key);
      return [span?.[rowIndex] ?? 1, 1];
    }
    return spanMethod({ row, column, rowIndex, columnIndex });
  };
  return columnSpan;
};
1
2
3
4
5
6
7
8
9
10
11
12
#Element Plus#Composition#Vue
上次更新: 2023/06/01, 12:40:50

← 图表组件响应式探索 简单的curd组件封装→

Theme by Vdoing | Copyright © 2021-2023 Wiidede | Website use MIT License | Article content & logo use CC-BY-SA-4.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式