当前位置: 代码网 > it编程>编程语言>Javascript > vue中循环表格数据出现数据联动现象(示例代码)

vue中循环表格数据出现数据联动现象(示例代码)

2024年11月25日 Javascript 我要评论
vue中循环表格数据,出现数据联动现象。问题描述:如图我输入期数为4,会循环出来4个表格,其中名额分配一栏人数是可以编辑的,但是当我修改第一个表格的数据之后,后面的表格数据也跟着修改了。源码如下<

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表格数据联动内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com