动态输入,v模型更新v-for中的所有值

时间:2019-06-13 10:13:27

标签: vue.js vuejs2 v-for v-model

我在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">

但是它不起作用。如果您输入“消息”输入,则所有“消息”输入都会被更新。

如何只更新相关值?

感谢帮助!

1 个答案:

答案 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);
  }
}