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 相关文章推荐
用YUI做了个标签浏览效果
Feb 20 Javascript
将光标定位于输入框最右侧实现代码
Dec 04 Javascript
JS实现星星评分功能实例代码(两种方法)
Jun 09 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
Oct 15 Javascript
js编写的treeview使用方法
Nov 11 Javascript
JS中闭包的经典用法小结(2则示例)
Dec 28 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
JS库之Three.js 简易入门教程(详解之一)
Sep 13 Javascript
vue axios重复点击取消上一次请求封装的方法
Jun 19 Javascript
js使用文件流下载csv文件的实现方法
Jul 15 Javascript
javascript网页随机点名实现过程解析
Oct 15 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实现的MySQL数据浏览器
2007/03/11 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
如何清空Session
2015/02/23 面试题
中专生自荐信
2013/10/12 职场文书
英文简历中的自我评价用语
2013/12/09 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
护士先进个人总结
2015/02/13 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python