Maison > interface Web > js tutoriel > le corps du texte

Comment utiliser des instructions personnalisées dans Vue pour implémenter la fonction de sélection de case à cocher

亚连
Libérer: 2018-06-02 17:26:10
original
2361 Les gens l'ont consulté

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:&#39;&#39;,
      customerResult:&#39;&#39;,
     }
    },
    directives: {
     &#39;check-all&#39;: {
      twoWay: true,
      params: [&#39;checkData&#39;,&#39;result&#39;,&#39;key&#39;],
      bind() {
       /*为原始数据的每一个对象添加一个checked属性*/
       this.vm[this.params.checkData].forEach((item)=>{
        Vue.set(item,&#39;checked&#39;,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>
Copier après la connexion

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
}
Copier après la connexion

<🎜. >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
}
Copier après la connexion

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 :

&#39;check-all&#39;, {
  twoWay: true,
  params: [&#39;checkData&#39;, &#39;result&#39;, &#39;key&#39;,&#39;relative&#39;],
  /*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, &#39;checked&#39;, 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()
  },
 }
Copier après la connexion

À 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!