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 相关文章推荐
js验证表单第二部分
Nov 25 Javascript
动态加载dtree.js树treeview(示例代码)
Dec 17 Javascript
javascript 常见功能汇总
Jun 11 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
Aug 27 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
Jul 08 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 Javascript
JS实现的文件拖拽上传功能示例
May 21 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
Node.js操作系统OS模块用法分析
Jan 04 Javascript
sortable+element 实现表格行拖拽的方法示例
Jun 07 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 Javascript
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 Vue.js
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
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
Highcharts入门之简介
2016/08/02 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python2.x与Python3.x的区别
2016/01/14 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
python实现广度优先搜索过程解析
2019/10/19 Python
python 实现按对象传值
2019/12/26 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
化工专业推荐信范文
2013/11/28 职场文书
平安建设汇报材料
2014/12/29 职场文书
丧事答谢词大全
2015/09/30 职场文书
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技