2017-03-15 24 views
19

Jestem nowy w Vuejs. Stworzyłem coś, ale nie wiem, czy to jest prosta/właściwa droga.Vuejs i Vue.set(), tablica aktualizacji

co chcę

Chcę kilka dat w tablicy i aktualizować je na imprezy. Najpierw spróbowałem Vue.set, ale to nie działa. Teraz po zmianie mojego elementu tablicy:

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

I push() nic do tablicy i będzie aktualizować .. Ale czasami ostatni element zostanie ukryta, jakoś ... Myślę, że to rozwiązanie jest nieco hacky, jak mogę go uczynić stabilnym?

Prosty kod jest tutaj:

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

Odpowiedz

10

VueJS nie może pickup zmiany do stanu, jeśli manipulować tablice jak ten.

Jak wyjaśniono w Common Beginner Gotchas, należy użyć metod tablicowych, takich jak push, splice lub cokolwiek innego i nigdy nie modyfikować indeksów takich jak ten a[2] = 2 ani właściwości .length tablicy.

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

 

 
\t 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>

+0

Perfekcyjne dzięki za link. Potrafię przyjąć odpowiedź w ciągu 3 minut. Byłem nieco zdezorientowany przy użyciu Vue.set() lub $ set. Ale przeczytam tę dokumentację dzięki. –

+1

Jak powiedziałem w dokumentach, $ set to po prostu ładny .splice(). Ma to sens, ponieważ tak jak mówią w dokumentach, należy zmodyfikować tablicę za pomocą jej metod. – Borjante

+0

Pls nie łączą wcięć tabulacji z wcięciami spacji, rozmiar zakładki jest wyraźnie inny w aplikacji SE, co utrudnia odczytanie kodu – Ferrybig

32

Tak tylko dla innych, którzy przybyli na to pytanie. Pojawia się w pewnym momencie w Vue 2. * usunęli this.items.$set(index, val) na rzecz this.$set(this.items, index, val).

Splot jest nadal dostępny i tutaj znajduje się link do metod mutacji macierzy dostępnych w vue link.

EDIT

Dla vuex będziesz chciał zrobić Vue.set(state.object, key, value)

+1

Dokładnie to, czego szukałem, funkcja prosta zmieniona w najnowszym wydaniu; –

+0

Jaki ciąg należy podać jako "indeks"? – Kokodoko

+0

@Kokodoko możesz wyjaśnić, co próbujesz zrobić? Jeśli jest to tablica, powinna być liczbą dla indeksu. Łańcuch byłby, jeśli ustawiasz pole na obiekcie. –