réponses
100 vues
problème avec filtre avec vue Js
Bonjour a tous j'essaie de filtrer les elements aux click selon une proprieté sauf qu'il ne filtre pas vraiment
<div class="btn-group" role="group" aria-label="Basic example"> <button @click="filterUsers('Complet')" type="button" class="btn btn-outline-success">Complet</button> <button @click="filterUsers('Incomplet')" type="button" class="btn btn-outline-warning">Incomplet</button> <button @click="filterUsers('En attente')" type="button" class="btn btn-outline-secondary">En attente</button> </div>
et sur la boucle :
<tr v-for="user in filterrdUsers" :key="user.id"> <td> <a> {{ user.lastname }} {{ user.firstname }}</a> </td></tr>
et le vue js :
Vue.createApp({ data() { return { //les proprietés users: <?php echo json_encode($users) ?>, totalNumbersDocuments: <?php echo json_encode($totalNumbersDocuments) ?>, filter: '' } }, computed: { filteredUsers() { if (this.filter) { //recuperation de tout les utilisateurs avec le status correspondant this.users = this.users.filter(user => this.documentListCompleted(user.nombre_documents, this.totalNumbersDocuments).text === this.filter); } return this.users; }, }, // les methode qu'on souhaite appeler après un click ou une action methods: { // on change le status du filtre filterUsers(status) { this.filter = status; }, documentListCompleted(nombreDocumentUser, nombreDocumentTotal) { let completedStatus = {}; if (nombreDocumentUser !== 0 && nombreDocumentUser < nombreDocumentTotal) { completedStatus.text = "Incomplet"; completedStatus.icon = '<i class="fa-regular fa-hourglass-half"></i>'; completedStatus.color = "btn-warning"; return completedStatus } else if (nombreDocumentUser === nombreDocumentTotal) { completedStatus.text = "Complet"; completedStatus.icon = '<i class="fa-solid fa-check"></i>'; completedStatus.color = "btn-success"; return completedStatus } else if (nombreDocumentUser === 0) { completedStatus.text = "En attente"; completedStatus.icon = '<i class="fa-regular fa-hourglass-half"></i>'; completedStatus.color = "btn-outline-secondary"; return completedStatus } }, }, watch: { //pour surveiller une propriete le nom de la fonction doit être le meme que celui de la //proprieté users() { console.log("user changed") }, }, }).mount("#userListDocuments")
si quelqu'un a une solution svp
Salut @dani03
Je vois qu'ici tu a mail écris le nom de ta fonction
// retire filterrdUsers et remplace par filteredUsers <td> <a> {{ user.lastname }} {{ user.firstname }}</a> </td></tr>
salut @stevymarlino oui j'ai modifié mais je n'arrive toujours pas a filtré lorsque je change le contenu de ma propriétié users
computed: { filteredUsers() { if (this.filter) { //recuperation de tout les utilisateurs avec le status correspondant return this.users.filter(user => { let status = this.documentListCompleted(user.nombre_documents, this.totalNumbersDocuments); return status.text === this.filter; }); } return this.users; } },
modifie ta fonction
filteredUsers
pour que ça retourne un nouveau tableau filtré, en lieu et place de mutéthis.users
j'ai modifié comme tu as dis @stevymarlino mais maintenant mon tableau ne se met pas à jour j'ai ajouté une proprieté mais elle n'a pas trop d'incidence je filtre bien
// vue pour les status complet imcomplet Vue.createApp({ data() { return { //les propriétés originalUsers: <?php echo json_encode($users) ?>, // Liste originale des utilisateurs users: <?php echo json_encode($users) ?>, // Liste d'utilisateurs à afficher totalNumbersDocuments: <?php echo json_encode($totalNumbersDocuments) ?>, filter: '' } }, watch: { filter(newFilter) { // Appliquer le filtre et mettre à jour la liste des utilisateurs à afficher console.log(this.filter, this.filteredUsers) this.users = this.filteredUsers; } }, computed: { filteredUsers() { if (this.filter) { // Récupération de tous les utilisateurs avec le status correspondant return this.originalUsers.filter(user => { let status = this.documentListCompleted(user.nombre_documents, this.totalNumbersDocuments); return status.text === this.filter; }); } return this.originalUsers; } }, methods: { filterUsers(status) { this.filter = status; // Mettre à jour la liste des utilisateurs à afficher en fonction du filtre let usersFiltrer = this.filteredUsers; this.users = usersFiltrer; }, documentListCompleted(nombreDocumentUser, nombreDocumentTotal) { if (nombreDocumentUser === 0) { return { text: "En attente", icon: '<i class="fa-regular fa-hourglass-half"></i>', color: "btn-outline-secondary" }; } else if (nombreDocumentUser === nombreDocumentTotal) { return { text: "Complet", icon: '<i class="fa-solid fa-check"></i>', color: "btn-success" }; } else { return { text: "Incomplet", icon: '<i class="fa-regular fa-hourglass-half"></i>', color: "btn-warning" }; } } }, mounted() { console.log(this.users); } }).mount("#userListDocuments");
ma boucle j'utilise users
ici et pas filteredUsers
parce que je mets a jour dans le watcher ma propriete users . je ne sais pas si c'est la bonne méthode de faire
<tr v-for="user in users" :key="user.id"> <td> <a> {{ user.lastname }} {{ user.firstname }}</a> </td> <td> <span>{{ user.email }}</span></td> <td> <span>{{ user.nombre_documents }} sur <?= $totalNumbersDocuments ?> documents</span> </td> <td> <!-- on utlise la methode documentListCompleted de notre methode en bas de page en vue Js --> <span class="btn btn-sm" :class="documentListCompleted(user.nombre_documents, totalNumbersDocuments).color"> <span v-html="documentListCompleted(user.nombre_documents, totalNumbersDocuments).icon"></span> <span> {{ documentListCompleted(user.nombre_documents, totalNumbersDocuments).text }} </span> </span> </td> <td> <a :href="'<?= site_url("document-user/") ?>'+user['slug-name']" class="btn btn-sm btn-outline-primary"><i class=" me-1 fa-regular fa-eye"></i> Consulter les documents</a> </td> </tr>
mais je reussis à filtrer sauf que l'affichage ne se met pas à jour et j'ai une erreur après le 2eme click
Il faut Se connecter ou Créer un compte pour participer à cette conversation.