You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue 2.6.14循环内v-model值异常问题求助

问题:Vue2动态增删对象数组时v-model值同步异常

使用Vue 2.6.14开发时,对对象数组进行循环并在循环内使用v-model实现用户动态增删数据,但增删后出现异常:填写某索引对应的对象字段时,其余对象的对应字段会同步显示相同值。期望不同行的输入内容相互独立,互不影响。

相关代码

HTML部分

<div id="app">
  <div class="row mb-3" v-for="(i, idx) in products" :key="idx">
    <div>
      <button @click="addRow" class="btn btn-small btn-primary">
      add
      </button>
      <button @click="removeRow(idx)" class="btn btn-small btn-danger">
      remove
      </button>
    </div>
    <div class="mb-3">
      <input v-model="products[idx].name" type="text" class="form-control" id="name" placeholder="name">
    </div>
      <div class="mb-3">
      <input v-model="products[idx].category" type="text" class="form-control" id="category" placeholder="category">
    </div>
  </div>
</div>

JavaScript部分

new Vue({
    el: '#app',
  data: function() {
    return {
      products: [{
        name: null,
        category: null
      }],
      product: {
        name: null,
        category: null
      }
    }
  },
  methods: {
    addRow: function(){
        this.products.push(this.product);
    },
    removeRow: function(index){
        this.products.splice(index, 1);
    }
  }
})

问题原因

  1. 对象引用复用:addRow方法中直接将this.product对象推入数组,而对象是引用类型,数组中所有新增元素实际上指向同一个内存地址的对象,修改任意一个元素的字段,其他元素会同步变化。
  2. v-for的key使用不当:用数组索引idx作为key,当数组元素增删后,Vue的虚拟DOM diff算法会错误地复用组件实例,导致输入值的渲染异常。

解决方案

1. 新增行时创建新对象实例

修改addRow方法,每次新增都创建一个独立的空对象,避免引用复用:

addRow: function(){
    // 每次创建新的对象实例
    this.products.push({
      name: null,
      category: null
    });
}

2. 给v-for设置唯一key

为每个对象添加唯一标识(如id),并将其作为v-for的key,确保Vue能正确识别每个元素:

  • 修改数据初始化和新增逻辑,添加唯一id:
data: function() {
  return {
    products: [{
      id: Date.now(), // 初始元素添加唯一id
      name: null,
      category: null
    }]
  }
},
methods: {
  addRow: function(){
      this.products.push({
        id: Date.now(), // 新增元素添加唯一id
        name: null,
        category: null
      });
  },
  removeRow: function(index){
      this.products.splice(index, 1);
  }
}
  • 修改HTML中的v-for部分:
<div class="row mb-3" v-for="(item, idx) in products" :key="item.id">
  <div>
    <button @click="addRow" class="btn btn-small btn-primary">
    add
    </button>
    <button @click="removeRow(idx)" class="btn btn-small btn-danger">
    remove
    </button>
  </div>
  <div class="mb-3">
    <input v-model="item.name" type="text" class="form-control" placeholder="name">
  </div>
    <div class="mb-3">
    <input v-model="item.category" type="text" class="form-control" placeholder="category">
  </div>
</div>

修改后效果

修改后,新增的每一行都是独立的对象实例,填写任意行的输入框都不会影响其他行,增删操作也能正常渲染。

内容的提问来源于stack exchange,提问作者naticap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:10:54