javascript - 如何在不修改 vue 3 中的道具的情况下使用道具初始化状态
问题描述
我在我的 vue 3 组件中初始化状态如下:
data() {
return {
new_listing: this.listing //which is a prop
}
}
但是,当我将它绑定到输入时,例如:
<input type="text" placeholder="title" v-model="new_listing.title" />
预期的结果只是new_listing.title
改变,但道具listing
似乎也在改变。我怎样才能做到只有 statenew_listing.title
改变而不是 prop listing.title
。
解决方案
您需要克隆对象(制作新副本)。
在 javascript 中,当将对象分配给变量时,它不会创建该对象的新副本。相反,它通过引用原始对象来分配它。
因此,从您问题中的代码来看,doing会将对象{ new_listing: this.listing }
的引用分配给. 这意味着修改也会修改:this.listing
new_listing
new_listing
this.listing
要在 ES6+ 中克隆对象,您可以执行以下操作。这...
是一种扩展语法。在这种情况下,它是一种克隆对象的方法。
data() {
return {
new_listing: {...this.listing} //which is a prop
}
}
如果您不使用 ES6,请查看在 JavaScript 中深度克隆对象的最有效方法是什么?看看如何克隆一个对象。
注意:如果对象包含对象(例如{a: {b: "h"}}
,那么您将需要进行深度克隆(在对象中克隆对象)。
推荐阅读
- javascript - How can I collect data from multiple HTML checkboxes and input that data into a google sheet?
- mysql - How to do audit when using Spring batch as ETL
- r - Create multiple columns in data.table with `:=` without colnames
- javascript - 即使调用了 React 组件方法,expect(...).toHaveBeenCalled() 也会失败
- maple - 如何画出曲线
- python - Asynchronously chaining grpc calls
- angular - Observable subscribe not fired
- spinnaker - How add Bitbucket artifact in Spinnaker?
- e2e-testing - 在测试无服务器应用程序时,是否可以发出 API 请求以在 Cypress 中设置测试?
- android - 如何解决嵌套计数器?