如何从Vue.js中的数组中删除项目


88

我是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(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

});

我试图将事件传递给函数,然后使用slice函数删除该事件,我认为那是用于从数组中删除某些数据的代码。使用单键按钮和onclick事件从数组中删除数据的最佳方法是什么?


这回答了你的问题了吗?如何从数组中删除特定项目?
ponury-kostek

Answers:


147

您使用splice的方式有误。

重载为:

array.splice(开始)

array.splice(start,deleteCount)

array.splice(开始,deleteCount,itemForInsertAfterDeletion1,itemForInsertAfterDeletion2,...)

Start表示要启动的索引,而不是要删除的元素。并且您应该将第二个参数传递deleteCount为1,这意味着:“我要删除从索引{start}开始的1个元素”。

因此,您最好选择:

deleteEvent: function(event) {
  this.events.splice(this.events.indexOf(event), 1);
}

另外,您使用的是参数,因此您可以直接访问它,而不能使用 this.event

但是通过这种方式,您将不需要indexOf在每次删除操作中查找,为了解决此问题,您可以在index处定义变量v-for,然后将其传递而不是事件对象。

那是:

v-for="(event, index) in events"
...

<button ... @click="deleteEvent(index)"

和:

deleteEvent: function(index) {
  this.events.splice(index, 1);
}

太棒了,我已经以为我使用的拼接错误。您能告诉我拼接和切片之间的区别是什么吗?谢谢!
Giesburts

1
当然。基本上,sPlice修改原始数组,而slice则创建新数组。此处的更多信息:tothenew.com/blog/javascript-splice-vs-slice
Edmundo Rodrigues

您也可以将$ remove用作简写。
克里斯·迪克森

2
@EdmundoRodrigues,感谢这一点,'您可以在您v-for的位置定义索引变量':)我爱这样的宝石。
Valentine Shi

@埃德蒙多·罗德里格斯谢谢。真的很好。我只是用索引而不是对象的索引删除。非常感谢
priya_21 '19

62

您也可以使用。$ delete:

remove (index) {
 this.$delete(this.finds, index)
}

资料来源:


4
因为让Vue知道了新闻,所以这是正确的方法。
15:04签名

1
为什么在文档中说“您几乎不需要使用它”,这是一种好习惯吗?
米格尔·史蒂文斯

@Notflip:通常,您将只替换整个数组。
Katinka Hesselink,

1
当array.splice无法正常工作时,为什么这不是可接受的答案?@Gijsberts
yellowsir

1
@Roberto slice和拼接不同:)
Evil Pigeon

26

不要忘记绑定属性,否则总是删除最后一个项目

从数组中删除所选项目的正确方法:

模板

<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
}

这实际上应该是选择的答案。我想知道为什么两个选项(拼接或$ delete)都不起作用,结果证明我只是没有正确的密钥集。
Lunyx

好吧,它肯定删除了一些东西,但是当绑定尚未到位时,它才开始做一些奇怪的事情。
DZet

1
我花了4个小时想知道为什么最后一个元素总是被删除。这次真是万分感谢!
卡罗尔·西奥多·佩鲁

6

当您使用输入时,它甚至更有趣,因为它们应该被绑定。如果您对如何在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/vue@2.5.3/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>


这是有帮助的,但是您可以帮我吗?我在使用组件时卡住了 。codepen.io/wall
e/

3

您可以通过ID删除项目

<button @click="deleteEvent(event.id)">Delete</button>

在您的JS代码中

deleteEvent(id){
  this.events = this.events.filter((e)=>e.id !== id )
}

Vue包装了观察到的数组的变异方法,因此它们也将触发视图更新。单击此处了解更多详细信息。

您可能会认为这将导致Vue丢弃现有DOM并重新呈现整个列表-幸运的是,事实并非如此。


1
<v-btn color="info" @click="eliminarTarea(item.id)">Eliminar</v-btn>

对于您的JS:

this.listaTareas = this.listaTareas.filter(i=>i.id != id)

1
您的答案与其他人几乎相同,而且并不比其他人更好。因此,发布此帖子不值得。
foxiris

0

拼接是从特定索引中删除元素的最佳方法。给定的示例在控制台上进行了测试。

card = [1, 2, 3, 4];
card.splice(1,1);  // [2]
card   // (3) [1, 3, 4]
splice(startingIndex, totalNumberOfElements)

startingIndex从0开始。


0

为什么不一起省略该方法,例如:

v-for="(event, index) in events"
...
<button ... @click="$delete(events, index)">
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.