当前位置: 首页 > article >正文

Vben admin - 表格组件合并单元格

需求

最近在项目中有需求需要表格合并单元格,不但内容有合并的,操作列也需要合并,找遍vben官方例子,没有实现操作列合并的,只能硬着头皮实现,还好实现了,下面具体就是实现思路;

原型设计图

在这里插入图片描述

分析需求

整体思路就是当数据中一级分类值相同则进行合并分数、一级分类以及编辑分数(操作列),由于操作列合并vben框架目前不支持,只能在数据上下功夫,假设表格数据中每组数据返回字段operatorName:‘操作’;这样我们就像渲染普通数据一样渲染出来,然后再给器操作加上事件即可

合并核心思路
let newArr = data.reduce((result, item) => {
     // 首先将字段作为新数组result取出
     if (result.indexOf(item['name']) < 0) {
       result.push(item['name']);
     }
     return result;
   }, []).reduce((res, name) => {
     // 将name相同的数据作为新数组取出,并在其内部添加新字段**rowSpan**
     const children = data.filter((item) => item['name'] === name);
     // eslint-disable-next-line no-param-reassign
     res = res.concat(
       children.map((item, index) => ({
         ...item,
         ['rowspan']: index === 0 ? children.length : 0, // 将第一行数据添加rowSpan字段
       })),
     );
     return res;
   }, []);
整体代码
const [registerTable] = useTable({
  title: '合并单元格',
  bordered: true,
  // 假数据
  dataSource: [
    {
      key: '1',
      fenshu: 5,
      name: '政治',
      age: '政治交流',
      num: 4545,
      address: 'New York No. 1 Lake Park',
      rowspan:2
    },
    {
      key: '2',
      fenshu: 5,
      name: '政治',
      age: '总统选举',
      num: 4545,
      address: 'London No. 1 Lake Park',
      rowspan:0
    },
    {
      key: '3',
      fenshu: 5,
      name: '经济',
      age: '黄金大涨',
      num: 4545,
      address: 'Sidney No. 1 Lake Park',
      rowspan:1
    },
    {
      key: '4',
      fenshu: 5,
      name: '军事',
      age: '核弹引爆',
      num: 4545,
      address: 'London No. 2 Lake Park',
      rowspan:1
    },
    {
      key: '5',
      fenshu: 5,
      name: '安全',
      age: '食品安全',
      num: 4545,
      address: 'Dublin No. 2 Lake Park',
      rowspan:1
    },
  ],
   afterFetch: (data) => {
      let newArr = data
        .reduce((result, item) => {
          // 首先将字段作为新数组result取出
          if (result.indexOf(item['name']) < 0) {
            result.push(item['name']);
          }
          return result;
        }, [])
        .reduce((res, name) => {
          // 将name相同的数据作为新数组取出,并在其内部添加新字段**rowSpan**
          const children = data.filter((item) => item['name'] === name);
          // eslint-disable-next-line no-param-reassign
          res = res.concat(
            children.map((item, index) => ({
              ...item,
              ['rowspan']: index === 0 ? children.length : 0, // 将第一行数据添加rowSpan字段
            })),
          );
          return res;
        }, []);
      return newArr;
    },
  columns: [
  {
    title: '分数',
    dataIndex: 'fenshu',
    width: 200,
    customRender: ({ text, record }) => {
      const obj = {
        children: text,
        props: {} as any,
      };
      obj.props.rowSpan = record.rowspan;
      return obj;
    },
  },
  {
    title: '一级分类',
    dataIndex: 'name',
    customRender: ({ text, record }) => {
      const obj = {
        children: text,
        props: {} as any,
      };
      obj.props.rowSpan = record.rowspan;
      return obj;
    },
  },
  {
    title: '二级分类',
    dataIndex: 'age',
    width: 180,
  },
  {
    title: '内容',
    dataIndex: 'address',
    width: 380,
  },
  {
    title: '数据来源数量',
    dataIndex: 'num',
    width: 180,
  },
  {
      title: '操作',
      dataIndex: 'operatorName',
      width: 180,
      customRender: ({ text, record }) => {
        return {
          children: h('a', { onClick: () => handelEdit(record) }, text),
          props: {
            rowSpan: record.rowspan,
          },
        };
      },
      className: 'caozuo', // 单独加上样式类名,在css中将字体颜色改为蓝色 以便和普通数据进行区分
    },
],
  pagination: false,
  showIndexColumn: false,
})

// 编辑操作
const handelEdit = (record: Recordable) => {
 console.log(record)
};
最后实现效果图

在这里插入图片描述


http://www.kler.cn/a/105898.html

相关文章:

  • 鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作
  • 优化C++设计模式:用模板代替虚函数与多态机制
  • 探索 HTML 和 CSS 实现的 3D旋转相册
  • 蜀道山CTF<最高的山最长的河>出题记录
  • 分布式cap理论学习
  • 香港站群服务器有助于提升网站在搜索引擎中的排名
  • 针对element-plus,跳转jump(快速翻页)
  • WPF中的绑定知识详解(含案例源码分享)
  • 在Web中搜索(Searching the Web, ACM/ICPC Beijing 2004, UVa1597)rust解法
  • [Go版]算法通关村第十八关青铜——透析回溯的模版
  • 智能问答技术在百度搜索中的应用
  • k8s kubeadm配置
  • 安卓端GB28181设备接入模块如何实现实时位置订阅(MobilePosition)
  • 带你深入理解“栈”(c语言 c++和stl Stack三个版本的模拟实现)
  • 如何选择适合的美颜SDK?
  • ES 数据迁移最佳实践
  • hello react
  • 再获Gartner认可!持安科技获评ZTNA领域代表供应商
  • Instagram引流技巧:如何充分利用社交媒体来增加独立站流量
  • 【Overload游戏引擎细节分析】PBR材质Shader
  • 部署应用链太费心?Tanssi 教你轻松开发部署
  • 解锁高效检索技能:掌握MySQL索引数据结构的精髓
  • 阿里巴巴:海量请求下的接口并发,都有哪些方案?
  • 重复控制器的性能优化
  • [每周一更]-(第69期):特殊及面试的GIT问题解析
  • 华为云双十一服务器数据中心带宽全动态BGP和静态BGP区别