Maison >interface Web >js tutoriel >Comment utiliser des instructions personnalisées dans Vue pour implémenter la fonction de sélection de case à cocher
Maintenant, je vais partager avec vous une méthode d'utilisation des instructions personnalisées de Vue pour implémenter la fonction de sélection de case à cocher. Elle a une bonne valeur de référence et j'espère qu'elle sera utile à tout le monde.
Un projet sur lequel j'ai récemment travaillé nécessitait d'utiliser Vue pour implémenter la fonction de sélection de tout. J'ai examiné les pratiques en ligne et j'ai découvert que la réutilisabilité des calculs d'attributs n'était pas élevée, j'ai donc choisi des instructions personnalisées. la plupart des pratiques en ligne le sont. Il y aura certaines exigences de format pour les données originales et aucun résultat ne sera renvoyé, des améliorations ont donc été apportées.
Le code ci-dessus :
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <p id="app"> <input type="checkbox" v-model="allCheck" v-check-all="allCheck" check-data="list" result="customerResult" key="demo"> 全选 <ul> <li v-for="item in list"> <input type="checkbox" v-model="item.checked"> {{item.demo}} </li> </ul> <p > customerResult: {{customerResult}} </p> </p> <script src="vue.js"></script> <script> var vm = new Vue({ el: "#app", data:function(){ return { list:[{demo:1}, {demo:2}, {demo:3}], allCheck:'', customerResult:'', } }, directives: { 'check-all': { twoWay: true, params: ['checkData','result','key'], bind() { /*为原始数据的每一个对象添加一个checked属性*/ this.vm[this.params.checkData].forEach((item)=>{ Vue.set(item,'checked',false) }); /*提取被选中的项*/ this.setValue=function(){ let result=[] this.vm[this.params.checkData].forEach((item) => { if(item.checked){ result.push(item[this.params.key]) } }); this.vm[this.params.result]=result } /*如果所有的列表的checked属性都为true,则选中全选框,否则不选中全选框 */ this.vm.$watch(this.params.checkData, (data) => { if(data.every((item) => item.checked)) { this.set(true); } else { this.set(false); } this.setValue() }, {deep: true}); }, // checkAll发生更改时 update(checkAll) { /*如果全选框被选中,则将列表的所有checked属性转为true,否则转为false */ if(checkAll) { this.vm[this.params.checkData].forEach((item) => { item.checked = true; }); } else { this.vm[this.params.checkData].forEach((item) => { item.checked = false; }); } this.setValue() }, }, } }) </script> </body> </html>
Habituellement, nous devons obtenir une certaine valeur clé dans les données d'origine , Vous pouvez renseigner la valeur clé que vous souhaitez obtenir dans « clé », et « résultat » est l'élément sélectionné.
Parfois, nous devons renvoyer un objet complet et modifier le code Lorsqu'aucune clé n'est saisie, un tableau complet d'objets est renvoyé
this.setValue=()=>{ let result=[] this.vm[this.params.checkData].forEach((item) => { //删除checked属性 let temp={}; (()=>delete Object.assign(temp,item).checked)(); item.checked?result.push(item[this.params.key]||temp):""; }); this.vm[this.params.result]=result }Mais à ce stade, l'objet dans le tableau renvoyé n'a pas la même adresse de référence que les données d'origine. Lorsque la fonction array.$remove() doit être utilisée, elle échouera. le jugement défini par l'utilisateur renvoie si les données sont liées aux données d'origine
this.setValue = () => { let result = [] this.vm[this.params.checkData].forEach((item) => { if(this.params.relative) { item.checked ? result.push(item) : ""; }else{ //删除checked属性 let temp = {}; (() => delete Object.assign(temp, item).checked)(); item.checked ? result.push(item[this.params.key] || temp) : ""; } }); this.vm[this.params.result] = result }Lorsque la longueur des données est supérieure à 2, elle doit être jugée 2N fois, ce qui consomme beaucoup de performances. Optimisez-le :
'check-all', { twoWay: true, params: ['checkData', 'result', 'key','relative'], /*checkData:列表数据, result:返回的结果, key:列表数据中需要返回的字段, relative:是否返回与列表数据相同引用地址的选中结果*/ bind() { /*提取被选中的项*/ this.setValue = () => { let result = [] if (this.params.relative) { this.vm[this.params.checkData].forEach((item) => { item.checked ? result.push(item) : ""; }); } else { this.vm[this.params.checkData].forEach((item) => { //删除checked属性 let temp = {}; (() => delete Object.assign(temp, item).checked)(); item.checked ? result.push(item[this.params.key] || temp) : ""; }); } this.vm[this.params.result] = result }; /*为原始数据的每一个对象添加一个checked属性*/ this.addChecked = () => { this.vm[this.params.checkData].forEach((item) => { Vue.set(item, 'checked', false) }); }; /*如果所有的列表的checked属性都为true,则选中全选框,否则不选中全选框 */ this.vm.$watch(this.params.checkData, (data) => { if(!data.length) return; data.every((item) => item.checked) ? this.set(true) : this.set(false); this.setValue() }, {deep: true}); //当列表发生变化时重新绑定 this.vm.$watch(this.params.checkData, (data) => { if(!data.length) return this.addChecked(); }); }, // checkAll发生更改时 update(checkAll) { /*如果全选框被选中,则将列表的所有checked属性转为true,否则转为false */ checkAll ? this.vm[this.params.checkData].forEach((item) => { item.checked = true }) : this.vm[this.params.checkData].forEach((item) => { item.checked = false }); this.setValue() }, }À ce stade, seules N+1 fois doivent être jugées. J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir. Articles associés :
Tutoriel d'introduction à p5.js - Exemple d'interaction avec la souris
Quatre façons d'implémenter le bidirectionnel liaison avec les méthodes Vue
Méthode de réglage de surbrillance pour la barre de menu de navigation Vue-routing
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!