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 相关文章推荐
jquery 插件 人性化的消息显示
Jan 21 Javascript
js css后面所带参数含义介绍
Aug 18 Javascript
JS页面延迟执行一些方法(整理)
Nov 11 Javascript
js获取html页面节点方法(递归方式)
Dec 13 Javascript
jQuery插件scroll实现无缝滚动效果
Apr 27 Javascript
js实现一个链接打开两个链接地址的方法
May 12 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
vue2中的keep-alive使用总结及注意事项
Dec 21 Javascript
使用p5.js实现动态GIF图片临摹重现
Oct 23 Javascript
vuex存储token示例
Nov 11 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
Mar 25 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
php获取文件内容最后一行示例
2014/01/09 PHP
php 基础函数
2017/02/10 PHP
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
浅谈python对象数据的读写权限
2016/09/12 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
Python 自动化表单提交实例代码
2017/06/08 Python
详解重置Django migration的常见方式
2019/02/15 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
红色故事演讲稿
2014/05/22 职场文书
森林防火标语
2014/06/23 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
停水通知
2015/04/16 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
党风廉政建设心得体会
2019/05/21 职场文书