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 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
jquery实现tr元素的上下移动示例代码
Dec 20 Javascript
js中继承的几种用法总结(apply,call,prototype)
Dec 26 Javascript
使用JavaScript 实现的人脸检测
Mar 24 Javascript
JavaScript计划任务后台运行的方法
Dec 18 Javascript
JS中用try catch对代码运行的性能影响分析
Dec 26 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
js实现3d悬浮效果
Feb 16 Javascript
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 jQuery
基于IView中on-change属性的使用详解
Mar 15 Javascript
使用webpack搭建vue项目实现脚手架功能
Mar 15 Javascript
JavaScript实现网页计算器功能
Oct 29 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 has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
Add a Table to a Word Document
2007/06/15 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
python使用PyFetion来发送短信的例子
2014/04/22 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
python标识符命名规范原理解析
2020/01/10 Python
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
二年级班级文化建设方案
2014/05/10 职场文书
社区母亲节活动总结
2015/02/10 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL