J'utilise une table de données dans vuetify. J'utilise v-checkbox. Je souhaite supprimer l'élément sélectionné de la case à cocher v en cliquant sur un bouton. J'ai un bouton de suppression en bas du tableau de données. Ainsi, lorsqu'un utilisateur clique sur le bouton de suppression, la ligne sélectionnée dans la table de données doit être supprimée. Des idées sur la façon de procéder?
<template> <div> <v-toolbar flat color="white"> <v-toolbar-title>Manage Projects</v-toolbar-title> {{ props }} </v-toolbar> <v-data-table v-model="props" :headers="headers" :items="projects" item-key="name" select-all class="elevation-1" > <template slot="items" slot-scope="props"> <td> <v-checkbox v-model="props.selected" primary hide-details ></v-checkbox> </td> <td>{{ props.item.name }}</td> <td class="text-xs-left">{{ props.item.organisation }}</td> <td class="text-xs-left">{{ props.item.supplier }}</td> <td class="text-xs-left">{{ props.item.createdBy }}</td> <td class="text-xs-left">{{ props.item.updatedBy }}</td> </template> </v-data-table> <div class="text-xs-center pt-2"> <v-btn color="primary" @click="deleteProject">Delete</v-btn> <v-btn color="primary" @click="liveProject">Make Live</v-btn> <v-btn color="primary" @click="closeProject">Close</v-btn> </div> </div> </template>
<script> export default { data () { return { props:[], selected: [], headers: [ { text: 'Name', align: 'left', sortable: true, value: 'name' }, { text: 'Organisation', value: 'organisation' }, { text: 'Supplier', value: 'supplier' }, { text: 'Created By', value: 'createdBy' }, { text: 'Updated By', value: 'updatedBy' }, ], projects: [ { name: 'test', organisation: 'test', supplier: 'test', createdBy: 'test', updatedBy: 'test' }, { name: 'Ice cream sandwich', calories: 237, fat: 9.0, carbs: 37, protein: 4.3, iron: '1%' }, { name: 'Eclair', calories: 262, fat: 16.0, carbs: 23, protein: 6.0, iron: '7%' }, { name: 'Cupcake', calories: 305, fat: 3.7, carbs: 67, protein: 4.3, iron: '8%' }, { name: 'Gingerbread', calories: 356, fat: 16.0, carbs: 49, protein: 3.9, iron: '16%' }, { name: 'Jelly bean', calories: 375, fat: 0.0, carbs: 94, protein: 0.0, iron: '0%' }, { name: 'Lollipop', calories: 392, fat: 0.2, carbs: 98, protein: 0, iron: '2%' }, { name: 'Honeycomb', calories: 408, fat: 3.2, carbs: 87, protein: 6.5, iron: '45%' }, { name: 'Donut', calories: 452, fat: 25.0, carbs: 51, protein: 4.9, iron: '22%' }, { name: 'KitKat', calories: 518, fat: 26.0, carbs: 65, protein: 7, iron: '6%' } ] } }, methods: { deleteProject { // delete funtion here }, liveProject() { alert("live"); }, closeProject() { alert("close"); }, } } </script>
4 Réponses :
deleteProject(item_name){ this.projects.splice(this.projects.findIndex(e=> e.name == item_name),1) } // JS splice method for remove items from an array. // JS findIndex method for find the index of the element which you want to delete.
Cela ne supprime pas la ligne sélectionnée. Ceci supprime une autre ligne.
Qu'entendez-vous par autre ligne?
Je veux dire qu'il ne supprime pas la ligne sélectionnée que je sélectionne dans la case à cocher
J'ai eu un problème similaire hier mais avec jquery. Maintenant, avec vuejs, c'est en fait plus simple, je suppose, avec la liaison de modèle afin que toutes les lignes sélectionnées soient poussées vers une propriété de données. Ensuite, en cliquant sur Supprimer, parcourez tous les identifiants ou clés sélectionnés et supprimez-les de votre boutique ou en appelant une API backend ou votre propriété de données comme vous l'avez fait ici Par exemple
data: () => ({ selected: [], projects: {/*...content in here */}, }); methods: { delete() { this.selected.forEach(function(project) { // project here is just the index of the selected in the projects array projects.splice(project, 1); }); this.selected = []; // don't forget to empty selected } }
Voici le code pour supprimer les lignes sélectionnées de votre table de données.
Consultez l'exemple ci-dessous.
Lien Codepen vers votre solution
Template=>
new Vue({ el: '#app', data () { return { selected: [], headers: [ { text: 'Dessert (100g serving)', align: 'left', sortable: false, value: 'name' }, { text: 'Calories', value: 'calories' }, { text: 'Fat (g)', value: 'fat' }, { text: 'Carbs (g)', value: 'carbs' }, { text: 'Protein (g)', value: 'protein' }, { text: 'Iron (%)', value: 'iron' } ], desserts: [ { name: 'Frozen Yogurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0, iron: '1%' }, { name: 'Ice cream sandwich', calories: 237, fat: 9.0, carbs: 37, protein: 4.3, iron: '1%' }, { name: 'Eclair', calories: 262, fat: 16.0, carbs: 23, protein: 6.0, iron: '7%' }, { name: 'Cupcake', calories: 305, fat: 3.7, carbs: 67, protein: 4.3, iron: '8%' }, { name: 'Gingerbread', calories: 356, fat: 16.0, carbs: 49, protein: 3.9, iron: '16%' }, { name: 'Jelly bean', calories: 375, fat: 0.0, carbs: 94, protein: 0.0, iron: '0%' }, { name: 'Lollipop', calories: 392, fat: 0.2, carbs: 98, protein: 0, iron: '2%' }, { name: 'Honeycomb', calories: 408, fat: 3.2, carbs: 87, protein: 6.5, iron: '45%' }, { name: 'Donut', calories: 452, fat: 25.0, carbs: 51, protein: 4.9, iron: '22%' }, { name: 'KitKat', calories: 518, fat: 26.0, carbs: 65, protein: 7, iron: '6%' } ] } }, methods: { deleteItem () { if(confirm('Are you sure you want to delete this item?')){ for(var i = 0; i <this.selected.length; i++){ const index = this.desserts.indexOf(this.selected[i]); this.desserts.splice(index, 1); } } } } })
Script => p>
<div id="app"> <v-app id="inspire"> <v-data-table v-model="selected" :headers="headers" :items="desserts" item-key="name" select-all class="elevation-1" > <template slot="items" slot-scope="props"> <td> <v-checkbox v-model="props.selected" primary hide-details ></v-checkbox> </td> <td>{{ props.item.name }}</td> <td class="text-xs-right">{{ props.item.calories }}</td> <td class="text-xs-right">{{ props.item.fat }}</td> <td class="text-xs-right">{{ props.item.carbs }}</td> <td class="text-xs-right">{{ props.item.protein }}</td> <td class="text-xs-right">{{ props.item.iron }}</td> </template> </v-data-table> <div> <v-btn color="primary" @click="deleteItem">Delete</v-btn> </div> </v-app> </div>
Et si plutôt qu'une boîte de confirmation, nous devons mettre une boîte de dialogue. Où l'ajoutons-nous?
Vous pouvez le remplacer si (confirmez ('Êtes-vous sûr de vouloir supprimer cet élément?')) Par n'importe quel type d'alerte ou de dialogue que vous souhaitez.
Faut-il simplement ajouter un v-dialog au lieu d'un v-btn?
J'ai ajouté une boîte de dialogue de base pour vous, vous pouvez la modifier à votre guise. codepen.io/anon/pen/pYzZPZ?editors=1010
cela fonctionne bien mais la boîte de dialogue ne se ferme pas d'elle-même une fois que nous supprimons un élément.
Oui oui ça l'est. J'ai essayé d'inclure un bouton supplémentaire dans la boîte de dialogue pour aucune option.
Assurez-vous que votre v-btn est à l'intérieur de v-dialog. De plus, j'ai besoin du code pour vérifier. Téléchargez un lien vers codepen si possible.
Merci beaucoup pour votre aide. Je ne déclarais pas de dialogue dans les données. C'est pourquoi ça ne fonctionnait pas
existe-t-il un moyen d'activer le bouton uniquement lorsque nous avons sélectionné une ligne? Sinon, le bouton doit rester désactivé
Il vous suffit d'ajouter ceci: disabled = "selected.length == 0" dans la balise v-dialog. Voici la solution mise à jour. codepen.io/anon/pen/pYzZPZ?editors=1010
Si le Table de données
est lié au tableau d'objets d'un magasin
:
Nous pouvons également utiliser map pour obtenir l ' index
de l'objet dans un tableau de stockage et le supprimer en utilisant:
Ici, l ' REMOVE_OBJECT_FROM_ARRAY: (état, charge utile) => {
let i = state.someArrayofObjects.map (item => item.id) .indexOf (payload.id);
state.someArrayofObjects.splice (i, 1);
}
id
est l'identifiant passé avec la charge utile à la MUTATION
, on peut aussi transmettre uniquement le id
dans son ensemble < code> charge utile . Dans ce cas, nous pouvons faire quelque chose comme: REMOVE_OBJECT_FROM_ARRAY: (état, charge utile) => {
let i = state.someArrayofObjects.map (item => item.id) .indexOf (payload);
state.someArrayofObjects.splice (i, 1);
}
Qu'obtenez-vous pour les accessoires sélectionnés? noms de projets?
Oui Nom du projet ainsi que d'autres informations dans la ligne