Vue Element 分組+多選+可搜索Select選擇器實現

最終效果(http://47.98.205.88:3000/mult_group_selection)見下圖。實際就是將element三種官方select實例整合起來,同時實現分組+多選+可搜索,此外點擊一級分組名可以實現全選/全不選。供有相關需求的開發者參考

image.png

準備工作:

除了vue腳手架、element等必要包之外。該項目還用到了linq.js(https://github.com/mihaifm/linq),該工具可以快速從數組中查找所需內容。

npm install --save linq

編輯build/webpack.base.conf.js

module:{
    ......
    //添加
    new webpack.ProvidePlugin({
      Enumerable: "linq"
    })
}

數據源格式:

var selectList = [
  {
    name:"",//一級名稱
    CName:"", //二級名稱
    value:"" //值
  },
  {name:"",CName:"",value:""},
  ......
]

實現:

script
data (){
  return{   
    selectModel: [],
    multipleSelectOption:[],
  }
},
methods:{
    //將源數據轉成element所需格式
    transMultipleSelectOption(){
        var level1List = Enumerable.from(this.allSelectList).distinct("o=>o.name").toArray();
              
         var newArr = level1List.map(item=>{
             let children = Enumerable.from(this.allSelectList).where((o)=>{return o.name==item.name;}).toArray();

             var options = children.map(itemc=>{
                 return {"name": itemc.CName, "value":itemc.value};
             });       
             return {"name": item.name, "options":options}
         });
         this.multipleSelectOption = newArr;
    },       
    //重置options(select自動補全相關)
    remoteMethod(queryString, lists) { //lists:原始數據
         var mappedList = Enumerable.from(lists).where((o)=>{return o.CName.indexOf(queryString)!=-1 
             || o.name.indexOf(queryString)!=-1;}).toArray(); //找出匹配搜索關鍵字的數據集
         var level1List = Enumerable.from(mappedList).distinct("o=>o.name").toArray(); //從所匹配的數據集中找出所有一級菜單集合(含去重)
        //重新拼成element所需的數據格式
         var newArr = level1List.map(item=>{
             let children = Enumerable.from(mappedList).where((o)=>{return o.name==item.name;}).toArray();

             var options = children.map(itemc=>{
                 return {"name": itemc.CName, "value":itemc.value};
             });       
             return {"name": item.name, "options":options}
         });
         this.multipleSelectOption = newArr;
    },
    //點擊一級菜單全選/全不選實現
    checkAll(value){ //value: 點擊的一級name
          var list = Enumerable.from(this.multipleSelectOption).where((o)=>{return o.name==value;}).toArray();
          var level2ValueList = Enumerable.from(list[0].options).select("o=>o.value").toArray(); //所有該一級下二級的value集合

          var num=0;
          level2ValueList.forEach((value)=>{
             this.selectModel2.forEach((model, index)=>{
                if(model==value){
                  this.selectModel2.splice(index, 1); //如有匹配,先刪除
                  num++;
                  return true;
                }
              })
           })

           if(num < level2ValueList.length){ //需要全選
              this.selectModel2 = this.selectModel2.concat(level2ValueList); //合并數組
           }
    
     }
},
mounted: function(){
     this.transMultipleSelectOption();
},
template
<el-select v-model="selectModel" multiple filterable remote reserve-keyword 
    placeholder="請輸入關鍵詞" :remote-method="(queryString)=>{
        remoteMethod(queryString, allSelectList);
    }">
    <el-option-group v-for="group in multipleSelectOption"
      :key="group.name"
      :label="group.name" 
      @click.native="checkAll(group.name)">
      <el-option v-for="item in group.options"
          :key="item.value"
          :label="item.name"
          :value="item.value">
      </el-option>
    </el-option-group>
</el-select>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容