vue中循环表格数据,出现数据联动现象。
问题描述:如图

我输入期数为4,会循环出来4个表格,其中名额分配一栏人数是可以编辑的,但是当我修改第一个表格的数据之后,后面的表格数据也跟着修改了。
源码如下
<template>
<div class="content">
<div style="margin: 20px;">
<span>期数:</span>
<el-input-number v-model="periods" :min="0" size="small" :precision="0" :controls="false" @change="handlechange"/>
</div>
<div v-for="(tabledata, index) in listdatas" :key="index" style="margin-top: 20px;">
<div style="width: 100%; text-align: right; margin-bottom: 5px;">
<el-button type="primary" size="small" plain @click="rowdel(index)">删除</el-button>
</div>
<vxe-table
:data="tabledata"
border
stripe
size="mini"
>
<vxe-column align="center" field="sectiondeptname" title="站段" min-width="180"></vxe-column>
<vxe-column align="center" field="usernumber" title="分配名额" min-width="180">
<template #default="{ row }">
<el-input-number v-model="row.usernumber" :min="0" size="small" :precision="0" :controls="false"/>
</template>
</vxe-column>
</vxe-table>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import { elmessagebox, elmessage } from 'element-plus';
// 期数
const periods = ref(0);
// 表格数据列表
const listdatas = ref([]);
// 初始表格数据
const initialdata = [
{ sectiondeptname: '初中', usernumber: 100 },
{ sectiondeptname: '高中', usernumber: 50 },
{ sectiondeptname: '小学', usernumber: 60 },
{ sectiondeptname: '大学', usernumber: 30 }
];
// 期数变化处理
const handlechange = (e) => {
if (listdatas.value.length === 0) {
for (let i = 0; i < e; i++) {
listdatas.value.push(initialdata);
}
} else {
let i = listdatas.value.length;
for (i; i < e; i++) {
listdatas.value.push(initialdata);
}
}
};
// 行删除事件
const rowdel = (index) => {
elmessagebox.confirm('确定将选择数据删除?', {
confirmbuttontext: '确定',
cancelbuttontext: '取消',
type: 'warning'
}).then(() => {
listdatas.value.splice(index, 1);
}).then(() => {
elmessage({
type: 'success',
message: '操作成功!'
});
});
};
</script>
<style scoped>
.content {
padding: 20px;
}
</style>问题原因
你遇到的问题是因为在生成多个表格时,所有表格的数据都引用了同一个对象或数组,导致数据联动现象。要解决这个问题,你需要确保每个表格的数据是独立的副本,而不是引用同一个对象或数组。
解决方案
在生成表格数据时,使用深拷贝来确保每个表格的数据是独立的副本。


代码如下
<template>
<div class="content">
<div style="margin: 20px;">
<span>期数:</span>
<el-input-number v-model="periods" :min="0" size="small" :precision="0" :controls="false" @change="handlechange"/>
</div>
<div v-for="(tabledata, index) in listdatas" :key="index" style="margin-top: 20px;">
<div style="width: 100%; text-align: right; margin-bottom: 5px;">
<el-button type="primary" size="small" plain @click="rowdel(index)">删除</el-button>
</div>
<vxe-table
:data="tabledata"
border
stripe
size="mini"
>
<vxe-column align="center" field="sectiondeptname" title="站段" min-width="180"></vxe-column>
<vxe-column align="center" field="usernumber" title="分配名额" min-width="180">
<template #default="{ row }">
<el-input-number v-model="row.usernumber" :min="0" size="small" :precision="0" :controls="false"/>
</template>
</vxe-column>
</vxe-table>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import { elmessagebox, elmessage } from 'element-plus';
// 期数
const periods = ref(0);
// 表格数据列表
const listdatas = ref([]);
// 初始表格数据
const initialdata = [
{ sectiondeptname: '初中', usernumber: 100 },
{ sectiondeptname: '高中', usernumber: 50 },
{ sectiondeptname: '小学', usernumber: 60 },
{ sectiondeptname: '大学', usernumber: 30 }
];
// 期数变化处理
const handlechange = (e) => {
if (listdatas.value.length === 0) {
for (let i = 0; i < e; i++) {
let tabledata = initialdata.map(item => ({ ...item})); // 使用深拷贝
listdatas.value.push(tabledata);
}
} else {
let i = listdatas.value.length;
for (i; i < e; i++) {
let tabledata = initialdata.map(item => ({ ...item})); // 使用深拷贝
listdatas.value.push(tabledata);
}
}
};
// 行删除事件
const rowdel = (index) => {
elmessagebox.confirm('确定将选择数据删除?', {
confirmbuttontext: '确定',
cancelbuttontext: '取消',
type: 'warning'
}).then(() => {
listdatas.value.splice(index, 1);
}).then(() => {
elmessage({
type: 'success',
message: '操作成功!'
});
});
};
</script>
<style scoped>
.content {
padding: 20px;
}
</style>到此这篇关于vue中循环表格数据,出现数据联动现象。的文章就介绍到这了,更多相关vue表格数据联动内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论