动态输入,v-model 更新 v-for 中的所有值
Dynamics inputs, the v-model update all values in v-for
我用 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">
但是没用。如果您写入 "message" 输入,所有 "message" 输入都将更新。
如何只更新相关值?
感谢帮助!
发生这种情况是因为 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);
}
}
我用 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">
但是没用。如果您写入 "message" 输入,所有 "message" 输入都将更新。
如何只更新相关值?
感谢帮助!
发生这种情况是因为 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);
}
}