【Vue】单元格合并,与动态校验
效果要求
先看需求效果:
多个数据授权项,配置的时候,业务名称大多数都是一样的,需要合并单元格处理
在elementUI组件文档中有说明[合并列行]:
https://element.eleme.io/#/zh-CN/component/table
实际解决办法参考的是:
https://www.jianshu.com/p/67fab89b4c55
代码实现:
1、准备合并行计算变量:
spanArr: [], spanIdx: 0,
2、接口初始化表格数据时先计算合并的数值:
async initialUsableGrantItems() { /* 每次加载重置合并行计算 */ this.spanArr = [] this.spanIdx = 0 this.role.corpList = [{ id: this.role.sysArCoId }] const { data: tableData } = await listOptionalGrantItems(this.role) tableData.forEach((row, idx) => { if (this.isDtmDrVal(row) || this.isKeyDrVal(row)) row.drValue = JSON.parse(row.drValue) /* 动态合并列 执行计算 */ if (idx === 0) { this.spanArr.push(1) this.spanIdx = 0 } else { // 判断当前元素与上一个元素是否相同 ,accountType是我后台返回的标识符 if (row.drServIdent === tableData[idx - 1].drServIdent) { this.spanArr[this.spanIdx] += 1 this.spanArr.push(0) } else { this.spanArr.push(1) this.spanIdx = idx } } }) this.form.tableData = tableData },
3、表格组件声明合并的方法实现:
<el-table :span-method="arraySpanMethod" ... />
4、合并方法:
arraySpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 2) { const _row = this.spanArr[rowIndex] const _col = 1 console.log(`rowspan:${_row} colspan:${_col}`) return { // [0,0] 表示这一行不显示, [2,1]表示行的合并数 rowspan: _row, colspan: _col } } },
表格表单,勾选行动态校验
动态校验勾选行是否填充了数值,没有勾选的行不需要校验
思路时,提供一个空的rules对象,在勾选时为勾选行添加校验对象
取消勾选时删除这个勾选行的校验对象
1、绑定表格的勾选事件函数
<el-table ... @selection-change="handleSelectChange">
2、勾选事件触发,每次都要遍历比较
handleSelectChange(val) { const fullArr = this.form.tableData if (val.length !== 0) { for (let i = 0; i < fullArr.length; i++) { delete fullArr[i].drValRule delete fullArr[i].dtmRule for (let j = 0; j < val.length; j++) { if (i === fullArr.indexOf(val[j])) { /* DTM类型需要单独设置校验对象 */ if (val[j].drType === 'DTM') { this.$set(fullArr[i], 'dtmRule', this.dtmRule) } else { this.$set(fullArr[i], 'drValRule', JSON.parse(JSON.stringify(this.drValRule))) } break } } } } else { /* 没有选中的记录,清除每行的校验 */ for (let i = 0; i < fullArr.length; i++) { delete fullArr[i].drValRule delete fullArr[i].dtmRule } } this.checkedRows = val },
3、普通值的校验对象:
drValRule: [ { required: true, message: '请选择数据值', trigger: ['blur', 'change'] } ],
4、两个选择日期的校验对象:
dtmRule: [ { validator: dtmValCheck, trigger: ['blur', 'change'] } ] /* 校验方法, 判断是不是选择数组中的value都是空的 */ const dtmValCheck = (rule, value, callback) => { const isAllEmpty = value.every(timeStr => !timeStr) if (isAllEmpty) { callback(new Error('至少选择一项[限制日期]')) } else { callback() } }