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类后台管理菜单类-MenuSwitch
Sep 12 Javascript
jQuery的强大选择器小结
Dec 27 Javascript
js调试工具Console命令详解
Oct 21 Javascript
带有定位当前位置的百度地图前端web api实例代码
Jun 21 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
Mar 05 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
Aug 10 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
vuex vue简单使用知识点总结
Aug 29 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
JavaScript模拟push
2016/03/06 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
python Tkinter版学生管理系统
2019/02/20 Python
Python流程控制常用工具详解
2020/02/24 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
美国Max仓库:Max Warehouse
2020/05/31 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
大学四年学习的自我评价分享
2013/12/09 职场文书
寄语学生的话
2014/04/10 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
雾霾停课通知
2015/04/24 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
大学生活感想
2015/08/10 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript