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 @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
ça fonctionne c'est une problème avec mon DOM qui fait juste cette erreur
super alors bao.
Veuillez vous connecter ou créer un compte pour participer à cette conversation.