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 相关文章推荐
解析javascript 实用函数的使用详解
May 10 Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 Javascript
通过实例理解javascript中没有函数重载的概念
Jun 03 Javascript
javascript基础知识
Jun 07 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
Feb 18 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
详解使用nvm安装node.js
Jul 18 Javascript
十个免费的web前端开发工具详细整理
Sep 18 Javascript
微信小程序排坑指南详解
May 23 Javascript
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 Javascript
基于form-data请求格式详解
Oct 29 Javascript
js实现验证码功能
Jul 24 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
java解析json方法总结
2019/05/16 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python str与repr的区别
2013/03/23 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
经理助理岗位职责
2014/03/05 职场文书
就业意向书
2014/07/29 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android