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页面不刷新时全选择,全删除(GridView)
Apr 14 Javascript
jQuery学习笔记之DOM对象和jQuery对象
Dec 22 Javascript
js单独获取一个checkbox看其是否被选中
Sep 22 Javascript
jQuery中的siblings用法实例分析
Dec 24 Javascript
JavaScript中将数组进行合并的基本方法讲解
Mar 07 Javascript
浅谈JS中逗号运算符的用法
Jun 12 Javascript
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
Sep 27 Javascript
JS如何生成动态列表
Sep 22 Javascript
如何在Express4.x中愉快地使用async的方法
Nov 18 Javascript
关于Js中new操作符的作用详解
Feb 21 Javascript
AJAX实现省市县三级联动效果
Oct 16 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实现上传图片生成缩略图示例
2014/04/13 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
Js切换功能的简单方法
2010/11/23 Javascript
javascript 闭包
2011/09/15 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
input框中的name和id的区别
2016/11/16 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
python 从远程服务器下载日志文件的程序
2013/02/10 Python
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
python绘制汉诺塔
2021/03/01 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
Android面试宝典
2013/08/06 面试题
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
硕士研究生自我鉴定
2013/11/08 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
简短清晨问候语
2015/11/10 职场文书