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查找法实现当前栏目的高亮显示的代码
Nov 24 Javascript
JavaScript 字符串乘法
Aug 20 Javascript
JSON.parse 解析字符串出错的解决方法
Jul 08 Javascript
javascript类型系统——日期Date对象全面了解
Jul 13 Javascript
深入理解requestAnimationFrame的动画循环
Sep 20 Javascript
vue实现登录后页面跳转到之前页面
Jan 07 Javascript
关于axios如何全局注册浅析
Jan 14 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
Sep 15 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
微信公众号平台接口开发 菜单管理的实现
Aug 14 Javascript
基于JavaScript获取base64图片大小
Oct 18 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
PHP 文件扩展名 获取函数
2009/06/03 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
php字符串操作常见问题小结
2016/10/11 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
js实现开关灯效果
2020/03/30 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
Python常用正则表达式符号浅析
2014/08/13 Python
Python脚本实现下载合并SAE日志
2015/02/10 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
Python eval函数原理及用法解析
2020/11/14 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
盛大笔试题
2016/11/05 面试题
大学专科生推荐信范文
2013/11/23 职场文书
个人欠款担保书
2014/05/20 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
空气的环保标语
2014/06/12 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
追讨欠款律师函
2015/05/27 职场文书
javascript之Object.assign()的痛点分析
2022/03/03 Javascript