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 相关文章推荐
日期函数扩展类Ver0.1.1
Sep 07 Javascript
javascript检查日期格式的函数[比较全]
Oct 17 Javascript
非阻塞动态加载javascript广告实现代码
Nov 17 Javascript
Package.js  现代化的JavaScript项目make工具
May 23 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
JS设置cookie、读取cookie
Feb 24 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
May 12 Javascript
微信小程序 Audio API详解及实例代码
Sep 30 Javascript
EasyUI创建人员树的实例代码
Sep 15 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
axios中cookie跨域及相关配置示例详解
Dec 20 Javascript
vue.js实现图书管理功能
Sep 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
PHP中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
PHP 实现缩略图
2021/03/09 PHP
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
Python使用minidom读写xml的方法
2015/06/03 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
学生党支部先进事迹
2014/02/04 职场文书
幼儿园元旦活动感言
2014/03/02 职场文书
升国旗演讲稿
2014/09/05 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript