记录贴:vxe-table单元格合并规则的简单封装及应用

本文仅做为个人记录。

虚拟渲染与单元格合并,可以通过设置参数 merge-cells 或调用函数 setMergeCells、setMergeCells 来控制单元格的临时合并状态
(注:合并是以牺牲渲染性能为代价,如果需要用合并建议关闭虚拟滚动)

场景一 : 多层级解构数据,提取规则

针对多层级的数组对象处理,以对象某个属性为准(此处案例合并字段c)格式化数据并设置合并规则。
此处案例实现针对属性c内的数据进行解构处理,以c内数组对象信息为合并项进行规则提取及合并。。

// template	
<vxe-table :data="dataList"  :mergeCells="mergeCells"></vxe-table>
// data => 此处为接口返回的数据结构示例
const data = [
	{
		a:'1',
		b:'2',
		c:[
			{c1:'1',c2:'2'},
			{c1:'1',c2:'2'},
		],
		d:'3'
	}
]
// methods => 通过接口获取数据后进行转换
api().then(res => {
        this.loading = false;
        const {records} = res.data;
        // 待合并列的下标
        const colArr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 16, 17, 18, 22];
        const {result, mergeCells} = parseMergeCell(records, 'c', colArr);
        this.mergeCells = mergeCells;
        this.dataList = result;
})

封装的方法如下:↓↓↓↓↓↓↓↓

/**
 * 二维数组合并单元格(子选项仍为数组对象)
 * @param data 接口返回的数组对象
 * @param children 指定子选项为数组对象的某个属性值
 * @param colArr 需要合并列的下标
 * @returns {{result: *[], mergeCells: *[]}} result合并后的数据;mergeCells单元格合并规则
 */
export function parseMergeCell(data, children, colArr) {
  let result = [], mergeCells = [], rowIndex = 0;
  for (let i = 0; i < data.length; i++) {
    // 结构数组对象
    let {[children]: childrenList, ...params} = data[i];
    // 避免数组对象的属性值错误
    if (!childrenList) return {mergeCells, result};
    // 提取合并规则
    let rowspan = childrenList.length ? childrenList.length : 1;
    for (let j = 0; j < colArr.length; j++) {
      const cells = {row: rowIndex, col: colArr[j], rowspan: rowspan, colspan: 1};
      mergeCells.push(cells);
    }
    rowIndex += rowspan;
    // 提取合并内容
    for (let j = 0; j < childrenList.length; j++) {
      const row = Object.assign({...params}, childrenList[j]);
      result.push(row);
    }
  }
  return {mergeCells, result};
}

场景二 : 单层级提取规则

针对单层级的数组对象处理,以对象某个属性为准格式化数据并设置合并规则。
此处案例实现针对字段a数据发生重复时,以a为合并项进行合并规则提取及合并。

// template	
<vxe-table :data="dataList"  :mergeCells="mergeCells"></vxe-table>
// data => 此处为接口返回的数据结构示例
const data = [
		{a:'1',b:'2',c:'3',d:'4'},
		{a:'1',b:'2',c:'33',d:'44'},
		{a:'2',b:'2',c:'33',d:'444'},
		{a:'3',b:'2',c:'33',d:'444'},
]
// methods => 通过接口获取数据后进行转换
api().then(res => {
        this.loading = false;
        const {records} = res.data;
        this.dataList= records;
        // 待合并列的下标
        const colArr = [0, 1, 2, 3];
        this.mergeCells = parseMergeCell(records, 'a', colArr);
})

封装的方法如下:↓↓↓↓↓↓↓↓

/**
 * 二维数组合并单元格(仅针对数组对象本身)
 * @param data 接口返回的数组对象
 * @param field 指定合并选项为数组对象的某个属性值
 * @param colArr 需要合并列的下标
 * @returns mergeCells单元格合并规则
 */
export function parseMergeCell(data, field, colArr) {
  let mergeCells = [], repeatVal = '', rowspan = 1;
  for (let i = 0; i < data.length; i++) {
    let {[field]: fieldVal} = data[i];
    if (repeatVal === fieldVal) {
      rowspan++
    } else {
      repeatVal = fieldVal;
      rowspan = 1;
    }
    if (rowspan > 1) {
      const row = i - rowspan + 1;
      for (let j = 0; j < colArr.length; j++) {
        mergeCells.push({row, col: colArr[j], rowspan, colspan: 1})
      }
    }
  }
  return mergeCells
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vxe-table 是一个基于 Vue.js 的灵活的表格组件,它提供了丰富的功能和自定义选项。其中,单元格 input 弹窗是 vxe-table 的一个特性,它允许用户在表格中的单元格中输入内容时,弹出一个自定义的输入框。 当用户在单元格中输入内容时,vxe-table 会触发相应的事件回调。这些事件包括 cell-click、cell-dblclick、cell-keydown 等。我们可以通过监听这些事件来获取用户的输入并进行相应的处理。 使用单元格 input 弹窗时,可以通过设置 column 的 edit-render 配置项来自定义弹窗的样式和内容。例如,可以设置 type 为 input 的编辑器,使弹窗中显示一个文本输入框。同时,我们可以通过设置 column 的 edit-rules 配置项来对用户输入的内容进行校验。如果用户的输入不符合要求,可以弹出提示信息或阻止用户继续输入。 当用户在单元格弹窗中输入完内容并点击确认按钮时,vxe-table 会触发相应的回调函数,如 cell-submit、cell-valid-error 等。我们可以在这些回调函数中进行相应的操作,比如将用户输入的内容保存到数据库中或进行其他业务逻辑的处理。 总之,vxe-table单元格 input 弹窗回调提供了一个灵活的机制,使我们可以方便地处理用户在表格单元格中输入内容的情况。通过监听相关的事件和回调函数,我们可以获取用户输入并进行相应的处理,从而满足不同业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值