我是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;
答案 0 :(得分:73)
Vue.set(object, prop, value)
对于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(),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)
在此处观察对象和数组反应性: