Как удалить элемент из массива в Vue.js
Я новичок в vue.js(2), и сейчас я работаю над простым приложением для событий. Мне удалось добавить события, но теперь я хотел бы удалить события на основе нажатия на кнопку.
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 (Вью)
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
});
Я попытался передать событие функции, а затем удалить это с помощью функции slice, я думал, что это код для удаления некоторых данных из массива. Каков наилучший чистый способ удаления данных из массива с помощью кнопки simpleb и события onclick?
Ответы
Ответ 1
Вы используете splice
неправильно.
Перегрузки:
Array.splice (начало)
array.splice(start, deleteCount)
array.splice(start, deleteCount, itemForInsertAfterDeletion1, itemForInsertAfterDeletion2,...)
Запуск означает индекс, который вы хотите запустить, а не элемент, который вы хотите удалить. И вы должны передать второй параметр deleteCount
как 1, что означает: "Я хочу удалить 1 элемент, начиная с индекса {start}".
Так что вам лучше пойти с:
deleteEvent: function(event) {
this.events.splice(this.events.indexOf(event), 1);
}
Кроме того, вы используете параметр, поэтому вы this.event
к нему напрямую, а не с помощью this.event
.
Но таким образом вы будете искать ненужные для indexOf
при каждом удалении, для решения этого вы можете определить переменную index
в вашем v-for
, а затем передать ее вместо объекта события.
То есть:
v-for="(event, index) in events"
...
<button ... @click="deleteEvent(index)"
А также:
deleteEvent: function(index) {
this.events.splice(index, 1);
}
Ответ 2
Вы также можете использовать. $ Delete:
remove (index) {
this.$delete(this.finds, index)
}
источники:
Ответ 3
Не забудьте связать ключевой атрибут, иначе всегда последний элемент будет удален
Правильный способ удаления выбранного элемента из массива:
шаблон
<div v-for="(item, index) in items" :key="item.id">
<input v-model="item.value">
<button @click="deleteItem(index)">
delete
</button>
скрипт
deleteItem(index) {
this.items.splice(index, 1); \\OR this.$delete(this.items,index)
\\both will do the same
}
Ответ 4
Это даже смешнее, когда вы делаете это со входами, потому что они должны быть связаны. Если вы заинтересованы в том, как сделать это в Vue2 с опциями для вставки и удаления, смотрите пример:
пожалуйста, посмотрите 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>
Ответ 5
Вы можете удалить элемент через идентификатор
<button @click="deleteEvent(event.id)">Delete</button>
Внутри вашего кода JS
deleteEvent(id){
this.events = this.events.filter((e)=>e.id !== id )
}
Vue оборачивает наблюдаемые методы мутации массивов, чтобы они также запускали обновления представлений. Нажмите здесь для более подробной информации.
Вы можете подумать, что это заставит Vue отбросить существующий DOM и заново отобразить весь список - к счастью, это не так.
Ответ 6
<v-btn color="info" @click="eliminarTarea(item.id)">Eliminar</v-btn>
И для вашего JS:
this.listaTareas = this.listaTareas.filter(i=>i.id != id)