element+vue实现表格跨行
在项目开发中表格的使用还是很频繁的,而其中难免会涉及到表格的跨行跨列行为。这是一次记使用element-ui的table组件加vue实现的表格跨行跨列实践。
首先是查看element的table组件的api:
<template>
<div>
<el-table
:data="tableData6"
:span-method="objectSpanMethod"
border
style="width: 100%; margin-top: 20px">
<el-table-column
prop="id"
label="ID"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="amount1"
label="数值 1(元)">
</el-table-column>
<el-table-column
prop="amount2"
label="数值 2(元)">
</el-table-column>
<el-table-column
prop="amount3"
label="数值 3(元)">
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData6: [{
id: '12987122',
name: '王小虎',
amount1: '234',
amount2: '3.2',
amount3: 10
}, {
id: '12987123',
name: '王小虎',
amount1: '165',
amount2: '4.43',
amount3: 12
}, {
id: '12987124',
name: '王小虎',
amount1: '324',
amount2: '1.9',
amount3: 9
}, {
id: '12987125',
name: '王小虎',
amount1: '621',
amount2: '2.2',
amount3: 17
}, {
id: '12987126',
name: '王小虎',
amount1: '539',
amount2: '4.1',
amount3: 15
}]
};
},
methods: {
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) { // 开始合并的列的下标
if (rowIndex % 2 === 0) { // 满足此条件行占2行,列占1列
return {
rowspan: 2,
colspan: 1
};
} else { // 此处注意不满足以上条件的行列均占0,即从表格中删除其占位
return {
rowspan: 0,
colspan: 0
};
}
}
}
}
};
</script>
以上为规则的偶数行合并,但是在我们的实际工作,往往需要实现的是合并某字段的同值得行或列,因此使用了如下方式实现:
代码如下:
<template>
<div>
<el-table :data="originData"
:span-method="mergeStratege"
border
style="width: 100%">
<el-table-column prop="name"
label="姓名"></el-table-column>
<el-table-column prop="amount1"
label="数值1"></el-table-column>
<el-table-column prop="amount2"
label="数值2"></el-table-column>
<el-table-column prop="rowspan"
label="跨行"></el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data () {
return {
originData: [{
id: '12987122',
name: '王小虎',
amount1: '234',
amount2: '3.2',
amount3: 10
}, {
id: '12987123',
name: '王小虎',
amount1: '165',
amount2: '4.43',
amount3: 12
}, {
id: '12987124',
name: '王小虎',
amount1: '324',
amount2: '1.9',
amount3: 9
}, {
id: '12987125',
name: '张小豹',
amount1: '621',
amount2: '2.2',
amount3: 17
}, {
id: '12987126',
name: '张小豹',
amount1: '539',
amount2: '4.1',
amount3: 15
}, {
id: '12987124',
name: '赵小狮',
amount1: '324',
amount2: '1.9',
amount3: 9
}, {
id: '12987125',
name: '赵小狮',
amount1: '621',
amount2: '2.2',
amount3: 17
}, {
id: '12987124',
name: '赵小狮',
amount1: '324',
amount2: '1.9',
amount3: 9
}, {
id: '12987124',
name: '孙小马',
amount1: '324',
amount2: '1.9',
amount3: 9
}]
}
},
watch: {
originData: {
handler (newData) {
if (newData.length) {
let mergeStartRow = newData[0]
mergeStartRow.isStartMerge = true
mergeStartRow.rowspan = 1
mergeStartRow.startIndex = 0
for (let i = 1; i <= newData.length; i++) {
if ((newData[i] &&
mergeStartRow.name !== newData[i].name) ||
i === newData.length) {
mergeStartRow.endIndex = i
mergeStartRow.rowspan = mergeStartRow.endIndex - mergeStartRow.startIndex
mergeStartRow = newData[i]
if (mergeStartRow) {
mergeStartRow.isStartMerge = true
mergeStartRow.rowspan = 1
mergeStartRow.startIndex = i
}
}
}
}
},
immediate: true
}
},
methods: {
mergeStratege ({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
if (row.isStartMerge) {
return {
rowspan: row.rowspan,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
}
}
}
</script>
<style scoped>
</style>
以上为记录此次element table组件的使用