Element UI框架中巧用树选择器的实现


Posted in Javascript onDecember 12, 2018

本文介绍了Element UI框架中巧用树选择器的实现,分享给大家,顺便给自己留个笔记,具体如下:

Element UI框架中巧用树选择器的实现

介绍

在Element UI框架中有选择器和树形控件,但是没有树形选择器,也就是图上的这种方式的选择器,所以只能自定义选择器的slot。这里介绍的是多选情况,如果是单选则去掉复选框,修改一部分的处理即可。

html部分的代码:

<el-select
  v-model="dataArr"
  :multiple="multiple"
  filterable
  :placeholder="placeholder"
  :disabled="disabled"
  :collapse-tags="multiple"
  @remove-tag="handleTagChange"
  @visible-change="handleOptionHidden"
  class="hi-input">
  <el-option value="0"
    class="hidden">
  </el-option>
  <!--el-tree绑定的数组中children里的key值不能是0-->
  <el-tree
    ref="tree"
    :data="options"
    node-key="key"
    show-checkbox
    :default-checked-keys="selectedData"
    @check="handleCheckChange"
    :props="defaultProps">
  </el-tree>
</el-select>

在el-tree中绑定的值是已选择的key值组成的数组,check绑定的事件函数是为了:

  • 得到现在树选择器上选中的值
  • 过滤undefined、null的值(是为了容错处理) 具体代码如下:
handleCheckChange: function() {
  this.selectedData = this.$refs.tree.getCheckedKeys().filter(_ => _);
}

因为选择器是有label值和key值区分的,所以,每当在el-tree中选中值key值变化时,选择器上绑定的值label值也应该随之变化,所以在watch中监听key值,目的是在el-tree绑定的data中找到当前key值对应的label值 具体代码如下:

watch: {
  selectedData: function(newValue) {
    this.$nextTick(() => { this.dataArr = this.handleDataTransform(newValue, 'key', 'label'); });
  },
},
methods: {
  getNameById(array, value, id, name, multi) {
    let arr = array || [];
    let flag;
    let result = arr.filter(item => {
      return item[id] + '' === value + '';
    });
    if (multi) {
      flag = result.map(item => {
        return item[name];
      });
    } else {
      let obj = result[0];
      flag = name ? obj && obj[name] : obj;
    }
    return flag;
  },
  handleDataTransform: function(source, key, value) {
    return this.options.map(_ => {
      let arr = source.map(item => this.$util.getNameById(
        _.children,
        item,
        key,
        value
      )).filter(item => item);
      return arr;
    }).reduce((acc, cur) => {
      return acc.concat(cur);
    }, []);
  }
}

到这里为止,已经完成了树形控件到选择器的单向绑定,现在处理选择器的值发生改变时,树形控件也变化。因为此时是多选,所以要在remove-tag事件中处理,具体代码如下:

handleTagChange: function() {
  // handleDataTransform已经在之前定义过
  this.selectedData = this.handleDataTransform(this.dataArr, 'label', 'key');
  this.$refs.tree.setCheckedKeys(this.selectedData);
},

此时,这个树形选择器已经完成了~:clap::clap:,但是,我们还可以进一步优化,比如:如果选择后的内容与选择前的内容一样,不再发生请求的处理。 在选择器中绑定的visible-change事件可以处理,思想是:

  • item值为true,即展开下拉框时,把此时的值存储下来,注意:warning::这时候存储下来的值必须放在一个全局变量中,函数内的变量会在每次进入这个函数时初始化,所以在下拉框收起再进来这个函数时,之前存储的值已经没有了。
  • item值为false,即收起下拉框时,判断之前存储下的变量值和当前变量值是否相等,如果不相等才触发数据的更新。 具体代码如下:
handleOptionHidden: function(item) {
  // 处理选中内容没变的情况
  if (item) {
    this.selectedItem = [...this.selectedData];
  } else {
    // this.$util.isEqual()是判断两个数组是否相等函数,网上很多,请自行谷歌
    if (!this.$util.isEqual(this.selectedItem, this.selectedData)) {
      this.handleUpdate(this.selectedData);
    }
  }
    },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
原生js实现查找/添加/删除/指定元素的class
Apr 12 Javascript
js 动态为textbox添加下拉框数据源的方法
Apr 24 Javascript
利用jQuery实现可以编辑的表格
May 26 Javascript
JavaScript学习笔记--常用的互动方法
Dec 07 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
js闭包学习心得总结
Apr 17 Javascript
微信小程序http连接访问解决方案的示例
Nov 05 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
微信小程序渲染性能调优小结
Jul 30 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
Jan 22 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
vue addRoutes路由动态加载操作
Aug 04 Javascript
vue-cli中安装方法(图文详细步骤)
Dec 12 #Javascript
新版小程序登录授权的方法
Dec 12 #Javascript
加快Vue项目的开发速度的方法
Dec 12 #Javascript
关于自定义Egg.js的请求级别日志详解
Dec 12 #Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
Dec 12 #Javascript
d3绘制基本的柱形图的实现代码
Dec 12 #Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
Dec 12 #Javascript
You might like
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
Python新手如何理解循环加载模块
2020/05/29 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
应届中专生自荐书范文
2014/02/13 职场文书
热门专业求职信
2014/05/24 职场文书
安全目标管理责任书
2014/07/25 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
新年祝酒词大全
2015/08/11 职场文书
周一问候语大全
2015/11/10 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server