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 相关文章推荐
利用WebBrowser彻底解决Web打印问题(包括后台打印)
Jun 22 Javascript
javascript 写类方式之三
Jul 05 Javascript
js window.open弹出新的网页窗口
Jan 16 Javascript
关于JS中prototype的理解
Sep 07 Javascript
javascript实现方法调用与方法触发小结
Mar 26 Javascript
jQuery实现布局高宽自适应的简单实例
May 28 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
Jun 21 Javascript
AngularJs每天学习之总体介绍
Aug 07 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
微信小程序使用form表单获取输入框数据的实例代码
May 17 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
Angular8基础应用之表单及其验证
Aug 11 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
5.PHP的其他功能
2006/10/09 PHP
在PHP中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
PHP错误处理函数
2016/04/03 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
会议接待欢迎词
2014/01/12 职场文书
小学生安全保证书
2014/02/01 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
离婚协议书范本样本
2014/08/19 职场文书
2014年行政工作总结
2014/11/19 职场文书
农村党员干部承诺书
2015/05/04 职场文书
太空授课观后感
2015/06/17 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python