又踩雷啦啊哈哈哈哈哈。
来重现一下遇到的情境吧
export class AppComponent implements OnInit {
fruit : any = {
apple: {},
banana: {},
};
ngOnInit() {
this.fruit = {
apple: {
id: 1,
isSelect: false,
},
banana: {
id: 2,
isSelect: false,
},
};
}
onClick(isSelect: boolean) {
this.fruit = {
apple: {
id: 1,
isSelect,
},
};
}
fruit
的物件,里面有 apple
与 banana
这两样空物件OnInit
时,赋予了 apple
与 banana
值如图,按下去後,喷错了!
发现 banana 的 id 不见了,原来是我把 this.fruit
整个值给改掉了
本以为上述的写法,只会修改我有填的值 XD
这里我使用了 js 里的解构赋值
处理,也可以用来做 浅拷贝(shallow copy)
将 onClick 的写测改成这样
onClick(isSelect: boolean) {
this.fruit = {
...this.fruit, // shallow copy
apple: {
id: 1,
isSelect,
},
};
}
来看看成果。嗯...没喷错了 XD 结案!
将原本的物件转字串後再转成物件,就会又是全新的一个物件了!
JSON.parse(JSON.stringify(objArray));
objArray 为要带入的物件
本来以为是浅(深)拷贝的问题,後来仔细一看,原来是我自己搞错了,将 this.fruit
里面的整个值都盖掉,所以才会喷错,不过也刚好再度对深拷贝与浅拷贝的这件事加深印象。
案例:https://stackblitz.com/edit/angular-ivy-wvmptw
参考资料:
变量的解构赋值
深入探讨 JavaScript 中的参数传递:call by value 还是 reference?
关於 JS 中的浅拷贝(shallow copy)以及深拷贝(deep copy)
var myObject = { }; Object.defineProperty( myObjec...
来到了铁人赛的29天,扣除掉最後一集的心得,今天算是最後一个主题。 今天的影片和以往不太一样,我事...
延续昨日 今天来把登入的功能搞定吧! 记得我们day7学到的东西吗? :class="pr...
前言 我们经常会在求职网上看到需要某 SDK、API 的串接经验,我们应该也要做相关功课,才能理解这...
安安,搭给贺,终於来到最後一天了!(转圈d(`・∀・)b 不免俗一下还是要来讲一些心得,在挑战铁人赛...