开发者问题收集

V-model 数组项尽管有引用但无法更新

2019-10-30
38

我的主要目的是收集多个库存的请求数量(未来使用)。

* 我尝试为引用的 v-model 创建一个计数器。 我做了类似的事情。但它不起作用:

new Vue({
    el: '#app',
    data: {
      counter: []
    },
    methods: {
      increment(x) { 
        this.counter[x]++
      }
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <div v-for="i in 2">
  <div><input type="text" v-model="counter[i]"></div>
  <button v-on:click="increment(i)">Increment</button>
  </div>
</div>

还有其他方法可以做到这一点吗?我遗漏了什么吗?

2个回答

您的代码无法工作,原因有两个:

A) 您的数组为空,因此当您使用 counter[i] 作为 v-model 时,您使用的是 undefined ,它无法递增。

B) 您通过索引改变数组,这在 Vue 中无法很好地工作。要改变数组,您应该使用 pushsplice 等方法。

要修复您的代码,您必须解决两个问题。也就是说,您必须使用数值初始化数组并通过函数改变数组,如下所示:

new Vue({
el: '#app',
data: {
    counter: [0, 0]
},
methods: {
    increment(x) { 
        this.counter.splice(x, 1, this.counter[x] + 1);
    }
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
    <div v-for="(val, i) in counter">
        <div><input type="text" v-model="counter[i]"></div>
        <button v-on:click="increment(i)">Increment</button>
    </div>
</div>

请注意,我还将您的模板更改为使用 (val, i) in counter 而不是 i in 2 。这样做是为了您可以从起始索引访问数组。 val 是元素, i 是索引,因此您使用 i 来增加数组。

还请注意 splice 的使用。它的作用是将数组的第 x 个元素替换为其自己的第 x 个元素,但会递增。

Ayrton
2019-10-30

这可能不太漂亮,但是它有效:

var vm = {
  el: '#app',
  data: {
    counterel1: 0,
    counterel2: 0,
  },
  methods: {
    increment(x) {
      this.counter[x-1]++;
      console.log(this.counter);
    }
  }
}

vm.data.counter = [vm.data.counterel1, vm.data.counterel2];

new Vue(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <div v-for="i in 2">
    <div><input type="text" v-model="counter[i]"></div>
    <button v-on:click="increment(i)">Increment</button>
  </div>
</div>
connexo
2019-10-30