在Vue项目中,在表单中修改数据,表格数据也会被修改

问题描述:

在尝试修改表格中的数据时,即使用户在点击“取消”按钮后选择放弃修改并关闭窗口,表格中的数据仍然会显示为已修改状态。无论用户是否确认修改,数据都会被更改。只有在重新加载数据后,表格中的数据才会恢复为初始状态。

原有方案一:

在开始解决这个问题时,我的最初想法是在“取消”按钮的事件中添加一个加载数据的函数,每次取消并关闭窗口时重新发送请求来重新加载数据。但是,如果数据量很大,这种方法可能会影响用户体验,因为频繁请求加载可能会导致延迟。

原有方案二:

在重新查看代码后,我发现问题出在对象的赋值上。由于使用了浅拷贝,导致直接将对象的引用地址赋值过去,因此修改时会同步更改原始数据。这是代码中存在的问题所在。

这是原有的代码:

  const handleClick = (user: User) => {
    formData.value = user;
    visible.value = true;
  };

最初,我使用了对象扩展运算符(...)来拷贝对象,这确实可以复制对象的属性,但这种方式还只是进行浅拷贝。它只复制对象的第一层属性,如果对象中包含多层嵌套的对象,仍然是引用地址的赋值,因此这些嵌套对象会被同步修改。

  const handleClick = (user: User) => {
    formData.value = { ...user};
    visible.value = true;
  };

例子:

    const obj1={
        "name":"obj1",
        "age":12,
        "hobby":['a','b'],
        "user":{
            "a":1,
            "b":2
        }
    }
    const obj4={...obj1}
    obj4.name="张三"
    obj4.user.a=777
    console.log(obj1);
    console.log(obj4);


解决方案:

为了解决这个问题,我重新修改了代码,使用 JSON.parse(JSON.stringify(user)) 来进行深拷贝。这样可以确保所有层级的数据都被独立复制,不会影响原始数据。

    const obj1={
        "name":"lz",
        "age":12,
        "hobby":['a','b'],
        "user":{
            "a":1,
            "b":2
        }
    }
    // 深拷贝
    const obj3=JSON.parse(JSON.stringify(obj1))
    obj3.name="zhangsan666"
    obj3.user.a=666
    console.log(obj1);
    console.log(obj3);

使用深拷贝后,修改的就是独立的对象,不会影响原有对象。

以下是修改后的代码示例:

  const handleClick = (user: User) => {
    formData.value = JSON.parse(JSON.stringify(user));
    visible.value = true;
  };
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Vue的双向数据绑定和计算属性来实现表单批量更改选表格数据。以下是一个简单的示例: 在Vue的模板,你可以使用`v-model`指令将表单元素与Vue实例的数据进行绑定。对于表格的多个复选框,你可以使用`v-model`指令将它们与一个数组进行绑定,这个数组用来保存选数据。例如: ```html <template> <div> <table> <thead> <tr> <th> <input type="checkbox" v-model="selectAll" @change="selectAllRows"> </th> <th>Name</th> <th>Age</th> </tr> </thead> <tbody> <tr v-for="row in rows" :key="row.id"> <td> <input type="checkbox" v-model="selectedRows" :value="row.id"> </td> <td>{{ row.name }}</td> <td>{{ row.age }}</td> </tr> </tbody> </table> <div> <button @click="batchUpdate">Batch Update</button> </div> </div> </template> ``` 在Vue实例,你需要定义相应的数据和方法来实现批量更改。例如: ```javascript <script> export default { data() { return { rows: [ { id: 1, name: 'John', age: 25 }, { id: 2, name: 'Jane', age: 30 }, { id: 3, name: 'Bob', age: 35 } ], selectedRows: [], selectAll: false } }, methods: { selectAllRows() { if (this.selectAll) { this.selectedRows = this.rows.map(row => row.id); } else { this.selectedRows = []; } }, batchUpdate() { // 实现批量更新逻辑 console.log(this.selectedRows); } }, computed: { isAllSelected() { return this.selectedRows.length === this.rows.length; } } } </script> ``` 在上面的示例,`selectedRows`数组用来保存选的行的ID,`selectAll`用来表示是否全选。当全选框的状态改,`selectAllRows`方法被调用,根据`selectAll`的值来更新`selectedRows`数组。点击"Batch Update"按钮,`batchUpdate`方法被调用,你可以在这个方法实现批量更新的逻辑。 这样,当你在表单某些行的复选框,并点击"Batch Update"按钮,你将在控制台打印出选的行的ID。你可以根据实际需求,修改`batchUpdate`方法来实现你的批量更新逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值