el-table 实现表、表格行、表格列合并

最近写vue开发项目的时候,很多地方用到了Element组件中的Table 表格。经过一周的边学边做,我总结了以下三种有关表格的合并方法。

一、合并表头

话不多说,先看效果图

el-table 实现表、表格行、表格列合并_第1张图片

 代码如下:

el-table 实现表、表格行、表格列合并_第2张图片

表格结构如上,其中:header-cell-style对表头做了一些处理。 

, headFirst({row, colunm, rowIndex, columnIndex}) {
            if (rowIndex === 1) {
            //这里为了是将第二列的表头隐藏,就形成了合并表头的效果
                return {display: 'none'}

            }
            return "background:#f5f7fa"
        }

二、合并表格行

效果图如:

el-table 实现表、表格行、表格列合并_第3张图片

代码如下:

el-table 实现表、表格行、表格列合并_第4张图片

要进行表格合并,关键在于你要对数据渲染的前进行判断处理,在这里,首先要在table中写入:span-method=‘objectSpanMethod’,然后在js部分写上方法。

这里我以第一列为例:

// 领域合并
        , courseinit() {
            // 首先初始化
            var _this = this;
            this.courseArr = []
            this.coursePos = 0
            for (var i = 0; i < _this.tableData2.length; i++) {
             //判断是否是第一行
                if (i === 0) {
                	//导入第一行数据
                    _this.courseArr.push(1)
                    _this.coursePos = 0
                } else {
                //不是第一行时,就根据标识去存储,course为我第一行的prop属性的值
                    if (_this.tableData2[i].course === _this.tableData2[i - 1].course) {
                     // 查找到下一行的数据等于上一行的数据时每次要把之前存储的数据+1
                        _this.courseArr[_this.coursePos] += 1
                        _this.courseArr.push(0)
                    } else {
                    // 没有相同的数据时候,要记住当前的index
                        _this.courseArr.push(1)
                        _this.coursePos = i
                    }
                }
            }
        }
	//然后开始写组件自带的方法,
	, objectSpanMethod({rowIndex, columnIndex}) {
			//判断第一列的数据,上下行有没有相同的数据,有则合并,无则保留
            if (columnIndex === 0) {
            	//courseArr数组是上面输出来的,用来合并表格前做的数据判断
                const row1 = this.courseArr[rowIndex]
                const col1 = row1 > 0 ? 1 : 0
                return {
                    rowspan: row1,
                    colspan: col1
                }
            } else  if (columnIndex === 1) {
		        //这里是判断第二列的数据,nameArr和领域合并时候的处理一样,以此类推
                const row1 = this.nameArr[rowIndex]
                const col1 = row1 > 0 ? 1 : 0
                return {
                    rowspan: row1,
                    colspan: col1
                }
            }
        }

用这种方式合并的数据,最好是一条数据渲染一行,才好进行判断上下行的数据要不要进行合并。

三、合并表格列

效果图为:

el-table 实现表、表格行、表格列合并_第5张图片

代码如下: 

el-table 实现表、表格行、表格列合并_第6张图片

同样的你只要使用 :span-method="objectSpanMethod2"方法就好了。这里判断的方式就有些不同了。

objectSpanMethod2({row, column, rowIndex, columnIndex}) {
		            // 判断所有数据是否有child属性、且有长度、且其parent_id == 1的数据单元格进行合并
            if (!(row.child && row.child.length || row.parent_id != '0')) {
                if (columnIndex === 0) {
                    // 将第一列向右合并一格
                    return [1, 2];
                } else if (columnIndex === 1) {
                    // 删除第二列
                    return [0, 0];
                }
            } else if (columnIndex === 0) {
                // 对第一列的数据进行行合并
                const row1 = this.titleArr[rowIndex]
                const col1 = row1 > 0 ? 1 : 0
                return {
                    rowspan: row1,
                    colspan: col1
                }
            }
        }

列合并相对于行合并要简单,但是要确定好你要合并哪一行,如果表格是固定的,就轻松多了,只要给对应的那几行进行合并即可。

最后总结一下。

首先你要用rowIndex, columnIndex找到要合并的开始单元格,然后接下来的原理是:

returm {rowspan: 1,colspan: 1}表示表格不变
return (rowspan: 2,colspan: 1}表示表格向下合并一个单元格
return {rowspan: 1,colspan: 2}表示表格向右合并一个单元格
returm (rowspan: 0,colspan: 0}表示删除此单元格

原理是这样,重点还是看自己怎么将数据进行处理。好了,这是我这一周来写Element组件表格的心得,如果你有更好的方法可以评论区留言o

你可能感兴趣的:(javascript,前端,vue.js)