Jestem nowym użytkownikiem vue.js (2) i obecnie pracuję nad prostą aplikacją do obsługi wydarzeń. Udało mi się dodać wydarzenia, ale teraz chciałbym je usunąć, klikając przycisk.
HTML
<div class="list-group">
<div class="list-group-item" v-for="event in events">
<h4 class="list-group-item-heading">
{{ event.name }}
</h4>
<h5>
{{ event.date }}
</h5>
<p class="list-group-item-text" v-if="event.description">{{ event.description }}</p>
<button class="btn btn-xs btn-danger" @click="deleteEvent(event)">Delete</button>
</div>
</div>
</div>
JS (Vue)
new Vue ({
el: '#app',
data: {
events: [
{
id: 1,
name: 'Event 1',
description: 'Just some lorem ipsum',
date: '2015-09-10'
},
{
id: 2,
name: 'Event 2',
description: 'Just another lorem ipsum',
date: '2015-10-02'
}
],
event: { name: '', description: '', date: '' }
},
ready: function() {
},
methods: {
deleteEvent: function(event) {
this.events.splice(this.event);
},
// Adds an event to the existing events array
addEvent: function() {
if(this.event.name) {
this.events.push(this.event);
this.event = { name: '', description: '', date: '' };
}
}
} // end of methods
});
Próbowałem przekazać zdarzenie do funkcji, a potem usunąć to za pomocą funkcji slice, pomyślałem, że to ten kod do usuwania niektórych danych z tablicy. Jaki jest najlepszy i najczystszy sposób na usunięcie danych z tablicy za pomocą przycisku simpleb i zdarzenia onclick?
javascript
vuejs2
Giesburts
źródło
źródło
Odpowiedzi:
Używasz
splice
w niewłaściwy sposób.Przeciążenia to:
Początek oznacza indeks, który chcesz uruchomić, a nie element, który chcesz usunąć. Drugi parametr należy przekazać
deleteCount
jako 1, co oznacza: „Chcę usunąć 1 element zaczynający się od indeksu {start}”.Więc lepiej idź z:
deleteEvent: function(event) { this.events.splice(this.events.indexOf(event), 1); }
Ponadto używasz parametru, więc masz do niego bezpośredni dostęp, a nie za pomocą
this.event
.Ale w ten sposób przy
indexOf
każdym usunięciu sprawdzisz, co jest niepotrzebne, aby rozwiązać ten problem, możesz zdefiniowaćindex
zmienną u siebiev-for
, a następnie przekazać ją zamiast obiektu zdarzenia.To jest:
v-for="(event, index) in events" ... <button ... @click="deleteEvent(index)"
I:
deleteEvent: function(index) { this.events.splice(index, 1); }
źródło
v-for
” :) Uwielbiam TAK za takie perełki.Możesz także użyć. $ Delete:
remove (index) { this.$delete(this.finds, index) }
źródła:
źródło
Nie zapomnij powiązać atrybutu klucza, w przeciwnym razie zawsze zostanie usunięty ostatni element
Poprawny sposób usunięcia wybranego elementu z tablicy:
Szablon
<div v-for="(item, index) in items" :key="item.id"> <input v-model="item.value"> <button @click="deleteItem(index)"> delete </button>
scenariusz
deleteItem(index) { this.items.splice(index, 1); \\OR this.$delete(this.items,index) \\both will do the same }
źródło
Jeszcze zabawniej jest, gdy robisz to z nakładami, ponieważ powinny być one związane. Jeśli interesuje Cię, jak to zrobić w Vue2 z opcjami wstawiania i usuwania, zobacz przykład:
proszę spojrzeć i skrzypce js
new Vue({ el: '#app', data: { finds: [] }, methods: { addFind: function () { this.finds.push({ value: 'def' }); }, deleteFind: function (index) { console.log(index); console.log(this.finds); this.finds.splice(index, 1); } } });
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script> <div id="app"> <h1>Finds</h1> <div v-for="(find, index) in finds"> <input v-model="find.value"> <button @click="deleteFind(index)"> delete </button> </div> <button @click="addFind"> New Find </button> <pre>{{ $data }}</pre> </div>
źródło
Możesz usunąć przedmiot poprzez identyfikator
<button @click="deleteEvent(event.id)">Delete</button>
Wewnątrz twojego kodu JS
deleteEvent(id){ this.events = this.events.filter((e)=>e.id !== id ) }
Vue opakowuje metody mutacji obserwowanej tablicy, aby wyzwalały również aktualizacje widoku. Kliknij tutaj, aby uzyskać więcej informacji.
Możesz pomyśleć, że spowoduje to, że Vue wyrzuci istniejący DOM i ponownie wyrenderuje całą listę - na szczęście tak nie jest.
źródło
<v-btn color="info" @click="eliminarTarea(item.id)">Eliminar</v-btn>
A dla twojego JS:
this.listaTareas = this.listaTareas.filter(i=>i.id != id)
źródło
card = [1, 2, 3, 4]; card.splice(1,1); // [2] card // (3) [1, 3, 4] splice(startingIndex, totalNumberOfElements)
źródło
Dlaczego nie po prostu pominąć całej metody, na przykład:
v-for="(event, index) in events" ... <button ... @click="$delete(events, index)">
źródło