我在Vue.js 2中尝试以下代码:
<div id="app">
<div v-for="(item, index) in items">
<div>
<input type="text" v-model="items[index].message">
<input type="text" v-model="items[index].surface">
</div>
</div>
<button @click="addNewfield">Add</button>
</div>
var app = new Vue({
el: '#app',
data: {
item: {
message: 'test',
surface: 45
},
items: [],
},
mounted() {
this.items.push(this.item)
},
methods: {
addNewfield() {
this.items.push(this.item);
}
}
})
目标是当用户单击“添加”按钮时创建新闻输入。我尝试过类似的方式:
<input type="text" v-model="item.message">
但是它不起作用。如果您输入“消息”输入,则所有“消息”输入都会被更新。
如何只更新相关值?
感谢帮助!
答案 0 :(得分:2)
之所以发生这种情况,是因为Javascript中的对象是通过引用存储的。这意味着每次将this.item
推入数组时,都会添加对与最后一个对象完全相同的对象的引用。
您可以通过每次创建一个新对象来避免这种情况:
methods: {
addNewfield() {
const obj = {
message: 'test',
surface: 45
}
this.items.push(obj);
}
}
另一种选择是每次都克隆原始对象,如:
methods: {
addNewfield() {
const clone = Object.assign({}, this.item);
this.items.push(clone);
}
}