Vue Element 分组+多选+可搜索Select选择器实现示例


Posted in Javascript onJuly 23, 2018

最终效果(http://47.98.205.88:3000/mult_group_selection)见下图。实际就是将element三种官方select实例整合起来,同时实现分组+多选+可搜索,此外点击一级分组名可以实现全选/全不选。供有相关需求的开发者参考

Vue Element 分组+多选+可搜索Select选择器实现示例

准备工作:

除了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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
AutoSave/自动存储功能实现
Mar 24 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
jquery checkbox,radio是否选中的判断代码
Mar 20 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
Nov 22 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
微信小程序 保留小数(toFixed)详细介绍
Nov 16 Javascript
微信小程序picker组件下拉框选择input输入框的实例
Sep 20 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
Apr 04 Javascript
vue中使用protobuf的过程记录
Oct 26 Javascript
vue cli使用融云实现聊天功能的实例代码
Apr 19 Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 Javascript
解析原生JS getComputedStyle
May 25 Javascript
jquery实现搜索框功能实例详解
Jul 23 #jQuery
JavaScript实现点击出现图片并统计点击次数功能示例
Jul 23 #Javascript
Vue+axios实现统一接口管理的方法
Jul 23 #Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 #Javascript
js正则表达式校验指定字符串的方法
Jul 23 #Javascript
js中时间格式化的几种方法
Jul 22 #Javascript
详解vue axios二次封装
Jul 22 #Javascript
You might like
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
php实现源代码加密的方法
2015/07/11 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
arguments对象
2006/11/20 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
基于Python实现粒子滤波效果
2020/12/01 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
公益广告宣传方案
2014/02/28 职场文书
贷款担保书范文
2014/05/13 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
大型公益活动策划方案
2014/08/20 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
2015新年寄语大全
2014/12/08 职场文书
雷锋观后感
2015/06/10 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python