首页 新闻 会员 周边

动态添加数据的时候其他属性都可以显示出来,唯独合并那行显示不出来,请教什么问题

0
悬赏园豆:20 [待解决问题]

需求:动态添加table数据并合并行
问题:动态添加数据的时候其他属性都可以显示出来,唯独合并那行显示不出来,请教什么问题
<template>
<el-table
class="w-full"
:data="verificationTableData"
border
style=""
:span-method="spanMethod"
:height="'100%'">
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="节点名称" prop="nodeName">
<template slot-scope="{ row }">
<el-input placeholder="节点名称" v-model="row.nodeName"></el-input>
</template>
</el-table-column>
<el-table-column label="节点操作" prop="nodeOperation">
<template slot-scope="{ row }">
<i class="el-icon-circle-plus-outline text-larger cursor-pointer" @click="plusOutline(row)"></i>
<i class="el-icon-remove-outline text-larger cursor-pointer left-margin" @click="removeOutline(row)"></i>
</template>
</el-table-column>
<el-table-column label="部门" prop="department">
<template slot-scope="{ row }">
<el-select v-model="row.department" placeholder="部门" @change="departmentChange">
<el-option v-for="item in row.departmentOptions" :key="item.value" :label="item.name" :value="item.value">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="用户" prop="user">
<template slot-scope="{ row }">
<el-select v-model="row.user" placeholder="用户" @change="userChange">
<el-option v-for="item in row.userOptions" :key="item.value" :label="item.name" :value="item.value">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="用户操作" prop="userOperation">
<template slot-scope="{ row }">
<i class="el-icon-circle-plus-outline text-larger cursor-pointer" @click="userPlusOutline(row)"></i>
<i class="el-icon-remove-outline text-larger cursor-pointer left-margin" @click="userRemoveOutline(row)"></i>
</template>
</el-table-column>
</el-table>
</template>
data() {
return {
verificationTableData: [
{
nodeName: '节点',
nodeOperation: '节点操作',
department: '部门',
user: '用户',
userOperation: '',
departmentOptions: [ // 签核流程配置表格部门数据
{ name: '部门1', value: 1 },
{ name: '部门2', value: 2 },
],
userOptions: [ // 签核流程配置表格用户数据
{ name: '用户1', value: 1 },
{ name: '用户2', value: 2 },
]
},
{
nodeName: '节点',
nodeOperation: '节点操作',
department: '部门',
user: '用户',
userOperation: '',
departmentOptions: [ // 签核流程配置表格部门数据
{ name: '部门1', value: 1 },
{ name: '部门2', value: 2 },
],
userOptions: [ // 签核流程配置表格用户数据
{ name: '用户1', value: 1 },
{ name: '用户2', value: 2 },
]
},
], /
mergeObj: {}, // 用来记录需要合并行的下标
mergeArr: ['nodeName'] // 表格中的列名
}
},
mounted() {
this.getSpanArr(this.verificationTableData)
},
methods: {
userPlusOutline(row) {
console.log('111');
let obj = JSON.parse(JSON.stringify(this.addDefaultObj));
obj.nodeName = '节点';
obj.departmentOptions = [
{ name: '部门3', value: 3 },
{ name: '部门4', value: 4 },
],
obj.userOptions = [
{ name: '用户3', value: 3 },
{ name: '用户4', value: 4 },
]
this.verificationTableData.push(obj);
this.getSpanArr(this.verificationTableData)
this.$refs.verificationTableData.doLayout();
},
getSpanArr(data) {
this.mergeArr.forEach((key, index) => {
let count = 0; // 用来记录需要合并行的起始位置
this.mergeObj[key] = []; // 记录每一列的合并信息
data.forEach((item, index) => {
// index == 0表示数据为第一行,直接 push 一个 1
if (index === 0) {
this.mergeObj[key].push(1);
} else {
if(item[key] === data[index - 1][key]) {
this.mergeObj[key][count] += 1;
this.mergeObj[key].push(0);
} else {
// 如果当前行和上一行其值不相等
count = index; // 记录当前位置
this.mergeObj[key].push(1); // 重新push 一个 1
}
}
})

})
console.log('this.mergeObj', this.mergeObj);

},
// 签核流程配置表格合并
spanMethod({ row, column, rowIndex, columnIndex }) {
this.$nextTick(() => {
this.$refs.verificationTableData.doLayout();
});
// 判断列的属性
if(this.mergeArr.indexOf(column.property) !== -1) {
// 判断其值是不是为0
if(this.mergeObj[column.property][rowIndex]) {
return [this.mergeObj[column.property][rowIndex], 1]
} else {
// 如果为0则为需要合并的行
return [0, 0];
}
}
},
}

FallenLunatic的主页 FallenLunatic | 初学一级 | 园豆:182
提问于:2023-05-26 22:29
< >
分享
所有回答(2)
0

你可以在 userPlusOutline 方法中为新增的数据添加 span 属性,例如:

userPlusOutline(row) {
// ...
obj.span = 2; // 新增的数据需要合并两行
this.verificationTableData.push(obj);
this.getSpanArr(this.verificationTableData);
this.$refs.verificationTableData.doLayout();
}
如果你的数据中已经为需要合并的行指定了 span 属性,而且 span 属性的值也是正确的,那么可以检查一下是否需要触发 el-table 的重新布局。你可以在 spanMethod 的开头添加一行 $nextTick 方法,确保 el-table 完成渲染后再触发 doLayout:

spanMethod({ row, column, rowIndex, columnIndex }) {
this.$nextTick(() => {
this.$refs.verificationTableData.doLayout();
});
// ...
}

lanedm | 园豆:2378 (老鸟四级) | 2023-05-29 09:06
0

根据提供的代码,问题可能出在以下几个方面:

数据源更新后未重新计算合并行的信息:在添加数据后,需要调用getSpanArr方法来重新计算合并行的信息。确保在调用getSpanArr之后,重新布局表格以应用合并行的效果。
javascript
Copy code
userPlusOutline(row) {
// ...
this.getSpanArr(this.verificationTableData);
this.$refs.verificationTableData.doLayout();
},
合并行的属性名与表格列的属性名不匹配:确保mergeArr数组中的属性名与表格列的prop属性值一致。例如,如果要合并"节点名称"列的行,mergeArr中应包含"nodeName"。

表格列定义缺少合并行所需的span-method属性:在<el-table-column>标签中添加span-method属性,并将其值设为方法名spanMethod,用于指定合并行的逻辑。

html
Copy code
<el-table-column label="节点名称" prop="nodeName" :span-method="spanMethod">
<!-- ... -->
</el-table-column>
确保对应的列都有设置span-method属性,并将其值设为spanMethod方法。

如果上述解决方法无效,还请提供更多代码或详细描述具体的预期效果和实际现象,以便更准确地定位和解决问题。

Technologyforgood | 园豆:5675 (大侠五级) | 2023-05-30 23:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册