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 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
jquery插件开发之实现google+圈子选择功能
Mar 10 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
Apr 29 Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 Javascript
bootstrap table sum总数量统计实现方法
Oct 29 Javascript
微信小程序App生命周期详解
Jan 31 Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
swiper 自动图片无限轮播实现代码
May 21 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
Sep 13 Javascript
微信小程序使用map组件实现路线规划功能示例
Jan 22 Javascript
JavaScript 闭包的使用场景
Sep 17 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系统流量分析的程序
2006/10/09 PHP
Snoopy类使用小例子
2008/04/15 PHP
php文件上传的简单实例
2013/10/19 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
python爬取淘宝商品销量信息
2018/11/16 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
大学生学习2014全国两会心得体会
2014/03/13 职场文书
考试诚信承诺书
2014/05/23 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
绵山导游词
2015/02/05 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
关于车尾的标语大全
2015/08/11 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏