Vue创建非引用类型的对象

本文最后更新于:2024年3月18日 晚上

场景描述

在Vue的data中定义了一个对象,在将该对象传输给后端时需要做一些修改,因此新建了一个对象让他等于该对象,之后对新建的对象进行修改,此时会导致原有对象的属性也会改变。

显示的页面

1
2
3
4
5
6
7
8
9
10
11
<template>
<p>
姓名:{{user.name}}
</p>
<p>
年龄:{{user.age}}
</p>
<button @click="update">
复制对象,修改内容
</button>
</template>

JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export default {
data() {
return {
user:{
name:"李四",
age:17
}
}
},
methods:{
update(){
let newUser = this.user;
newUser.name = "张三";
}
}
}

显示效果

问题描述

可以看到,在update方法中新设了一个对象,之后对该对象进行了修改,而呈现的结果是原对象仍然也发生了改变

问题解决

使用JSON.parse()JSON.stringify()方法来创建对象

1
2
var jsonStr = JSON.stringify(user);
var newUser = JSON.parse(jsonStr);

拓展

对于深拷贝和浅拷贝,以及该问题的其他实现方法(第三方库Lodash)参考文章
在vue中子组件修改props引发的对js深拷贝和浅拷贝的思考 - 沉默术士 - 博客园 (cnblogs.com)


Vue创建非引用类型的对象
http://starnight.top/2023/11/01/Vue创建非引用类型的对象/
作者
Cardy Xie
发布于
2023年11月1日
许可协议