Vuejs和Vue.set(),更新数组

时间:2017-03-15 11:02:36

标签: javascript vue.js momentjs vuejs2

我是Vuejs的新手。做了些什么,但我不知道它是简单/正确的方式。

我想要什么

我想在数组中添加一些日期并在事件上更新它们。首先我尝试了Vue.set,但它没有成功。现在更改了我的数组项后:

this.items[index] = val;
this.items.push();

我向数组推送()没有任何东西,它会更新..但有时最后一项将被隐藏,不知何故......我认为这个解决方案有点hacky,我怎么能让它稳定?

简单代码在这里:



new Vue({
  el: '#app',
  data: {
  	f: 'DD-MM-YYYY',
    items: [
      "10-03-2017",
      "12-03-2017"
    ]
  },
  methods: {
    
    cha: function(index, item, what, count) {
    	console.log(item + " index > " + index);
      val = moment(this.items[index], this.f).add(count, what).format(this.f);
  		this.items[index] = val;
      this.items.push();
      console.log("arr length:  " + this.items.length);
    }
  }
})

ul {
  list-style-type: none;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.11/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<div id="app">
  <ul>
    <li v-for="(index, item) in items">
    <br><br>
      <button v-on:click="cha(index, item, 'day', -1)">
      - day</button>
      {{ item }}
      <button v-on:click="cha(index, item, 'day', 1)">
      + day</button>
    <br><br>
    </li>
  </ul>
</div>
&#13;
&#13;
&#13;

5 个答案:

答案 0 :(得分:73)

编辑2

  • 对于需要反应的所有对象更改,请使用Vue.set(object, prop, value)
  • 对于数组突变,您可以查看当前支持的列表here

编辑1

对于vuex,您需要执行Vue.set(state.object, key, value)

原始

所以只针对那些提出这个问题的人。它出现在Vue 2的某个时刻。*他们删除了this.items.$set(index, val),转而支持this.$set(this.items, index, val)

Splice仍然可用,这里是vue link中可用的数组变异方法的链接。

答案 1 :(得分:30)

如果您操纵这样的数组,VueJS无法将您的更改提取到状态。

正如Common Beginner Gotchas中所解释的那样,你应该使用push,splice等等数组方法,而不要修改像a[2] = 2这样的索引,也不要修改数组的.length属性。

new Vue({
  el: '#app',
  data: {
  	f: 'DD-MM-YYYY',
    items: [
      "10-03-2017",
      "12-03-2017"
    ]
  },
  methods: {
    
    cha: function(index, item, what, count) {
    	console.log(item + " index > " + index);
      val = moment(this.items[index], this.f).add(count, what).format(this.f);


	  this.items.$set(index, val)
      console.log("arr length:  " + this.items.length);
    }
  }
})
ul {
  list-style-type: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.11/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<div id="app">
  <ul>
    <li v-for="(index, item) in items">
    <br><br>
      <button v-on:click="cha(index, item, 'day', -1)">
      - day</button>
      {{ item }}
      <button v-on:click="cha(index, item, 'day', 1)">
      + day</button>
    <br><br>
    </li>
  </ul>
</div>

答案 2 :(得分:1)

如前所述-VueJS跟踪的所有操作均为here。 但我会再次复制它们:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

在开发过程中,您会遇到一个问题-如何忍受它:)。

push(),pop(),shift(),unshift(),sort()和reverse()很简单,在某些情况下可以为您提供帮助,但主要重点在于 splice(),可让您有效修改VueJ跟踪的数组。 因此,我可以分享一些最常用于数组的方法。

您需要替换数组中的项目:

// note - findIndex might be replaced with some(), filter(), forEach() 
// or any other function/approach if you need 
// additional browser support, or you might use a polyfill
const index = this.values.findIndex(item => {
          return (replacementItem.id === item.id)
        })
this.values.splice(index, 1, replacementItem)

注意:如果您只需要修改项目字段-您可以通过以下方式进行修改:

this.values[index].itemField = newItemFieldValue

这将由VueJS跟踪,因为将跟踪item(Object)字段。

您需要清空数组:

this.values.splice(0, this.values.length)

实际上,您可以使用此功能splice() - w3schools link 做更多 您可以添加多个记录,删除多个记录,等等。

Vue.set()和Vue.delete()

Vue.set()和Vue.delete()可能用于将字段添加到您的UI版本的数据中。例如,您需要在对象内添加一些其他计算出的数据或标志。您可以为您的对象或对象列表(在循环中)执行以下操作:

 Vue.set(plan, 'editEnabled', true) //(or this.$set)

并在Axios调用之前以相同的格式将编辑后的数据发送回后端:

 Vue.delete(plan, 'editEnabled') //(or this.$delete)

答案 3 :(得分:0)

一种替代方法-一种更轻量级的解决问题的方法-可能是,只是临时编辑数组,然后将整个数组分配回您的变量。因为Vue不监视单个项目,所以它将监视整个变量。

所以您也应该这样做:

var tempArray[];

tempArray = this.items;

tempArray[targetPosition]  = value;

this.items = tempArray;

这还将同时更新您的DOM。

答案 4 :(得分:-2)

在此处观察对象和数组反应性:

https://vuejs.org/v2/guide/reactivity.html