Vuejs и Vue.set(), массив обновлений
Я новичок в Vuejs. Сделал что-то, но я не знаю, это просто/правильно.
что я хочу
Я хочу несколько дат в массиве и обновлять их в событии. Сначала я попробовал Vue.set, но это не сработало. Теперь после изменения элемента массива:
this.items[index] = val;
this.items.push();
Я ничего не нажимаю() на массив, и он будет обновляться. Но иногда последний элемент будет скрыт, как-то... Я думаю, что это решение немного хаки, как я могу сделать его стабильным?
Простой код здесь:
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>
Ответы
Ответ 1
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
Так просто для других, кто приходит к этому вопросу. Он появляется в какой-то момент в Vue 2. * они удалили this.items.$set(index, val)
в пользу this.$set(this.items, index, val)
.
Сплит все еще доступен, и здесь есть ссылка на методы мутации массива, доступные в vue ссылка.
ИЗМЕНИТЬ
Для vuex вы захотите сделать Vue.set(state.object, key, value)