当前位置: 首页 > news >正文

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

    • 效果图
    • 定义子组件
    • 父组件应用

效果图

在这里插入图片描述

定义子组件

主要结合el-selectel-tree两个组件改造的。

<template><div class="selectTree"><el-select filterable :filter-method="filterMethod" class="main-select-tree" ref="selectTree" multiple v-model="transitValue" @remove-tag="removeTag" clearable @clear="clearInput" @focus="blurInput"><el-option v-for="item in selectOptions" :key="item.department_id" :label="item.name" :value="item.department_id" style="display: none;" /><el-tree class="main-select-el-tree" ref="selecteltree" :filter-node-method="filterNode" show-checkbox @check-change="handleCheckChange" :highlight-current="true" :data="dataArray" :props="defaultProps" :expand-on-click-node="false" node-key="department_id" @node-click="handleNodeClick" :current-node-key="currentKey"><span class="custom-tree-node" slot-scope="{ node, data }"><span :title="data.description">{{ node.label }}</span></span></el-tree></el-select></div>
</template><script>
export default {name: 'selectTree',props: {dataArray: Array},data () {return {transitValue: [],selectOptions: [],currentKey: null,defaultProps: {label: 'name',children: 'children'}}},computed: {formatData () {let result = []function getChild (item) {item.forEach((i, x) => {if (Array.isArray(i['children'])) {result.push(i)getChild(i['children'])} else {result.push(i)}})}getChild(this.dataArray)return result}},methods: {filterMethod (value) {this.$refs['selecteltree'].filter(value.trim())},blurInput () {console.log('1213')this.$refs['selecteltree'].filter('')},filterNode(value, data) {if (!value) return truereturn data.name.indexOf(value) !== -1},clearInput () {this.$refs['selecteltree'].setCheckedKeys([])},removeTag (e) {this.$refs['selecteltree'].setChecked(e, false)},handleCheckChange () {let check = this.$refs['selecteltree'].getCheckedNodes()console.log(check)let arr = check.filter((i) => !i.children)this.transitValue = arr.map((i) => {return i.department_id})this.$emit('treeChange', arr)}},watch: {formatData: {immediate: true,handler: function (n) {if (n.length > 0) {this.selectOptions = n} else {this.selectOptions = []}}}}
}
</script>
<style lang="less" scoped>
.main-select-el-tree {max-height: 300px;overflow-y: auto;
}
.el-select-dropdown.is-multiple .el-select-dropdown__item {display: none;
}
</style>

父组件应用

<div><template><p class="pTitle">{{ 选择团队 }}</p><select-tree ref="selectTree" @treeChange="treeChangeFun" :dataArray="orgList" /></template>
</div>import selectTree from '@/components/selectTreeMulti.vue'
data(){orgList: [],
},
mounted(){this.orgList = translateDataToTree(data).treeData // data数据格式参看备注1
},
components: {selectTree
},
methods: {treeChangeFun(val) {console.log(val)},translateDataToTree(data) {data = JSON.parse(JSON.stringify(data))// 删除所有 children,以防止多次调用let checkArr = []data.forEach(function (item) {delete item.children;if (item.is_bind) {checkArr.push(item.department_id)}});let map = {}; // 构建mapdata.forEach(i => {map[i.department_id] = i; // 构建以id为键 当前数据为值});let treeData = [];data.forEach(child => {const mapItem = map[child.parent_id]; // 判断当前数据的parentId是否存在map中if (mapItem) { // 存在则表示当前数据不是最顶层数据// 注意: 这里的map中的数据是引用了arr的它的指向还是arr,当mapItem改变时arr也会改变,踩坑点// 这里判断mapItem中是否存在children, 存在则插入当前数据, 不存在则赋值children为[]然后再插入当前数据(mapItem.children || ( mapItem.children = [] )).push(child)} else { // 不存在则是组顶层数据treeData.push(child);}});return {treeData: treeData,checkArr: checkArr};}
}

data格式:
在这里插入图片描述

http://www.lryc.cn/news/292162.html

相关文章:

  • 使用 Spring Boot 构建 Docker 镜像的简易指南
  • 「数据结构」3.ArrayList
  • H.264与H.265的主要差异
  • 【数据结构】 归并排序超详解
  • Debezium系列之:深入理解GTID全局事务标识,并记录一次数据库重启造成数据丢失的原因和解决方案
  • 格式化内存卡后,如何找回丢失的监控视频?
  • 《动手学深度学习(PyTorch版)》笔记4.8
  • 助力水下潜行:浮力调节系统仿真
  • Mysql常用sql语句
  • dubbo rpc序列化
  • 【C语言】va_list(可变参数处理)
  • 负载均衡下的webshell连接
  • 5-4 D. DS串应用—最长重复子串
  • C语言实现12种排序算法
  • C语言应用实例——贪吃蛇
  • Mac如何设置一位数密码?
  • 运动编辑学习笔记
  • C#小结:ScottPlot 5.0在VS2022桌面开发的应用(以winform为例)
  • Jmeter性能测试: Jmeter 5.6.3 分布式部署
  • 跟着cherno手搓游戏引擎【15】DrawCall的封装
  • Qt实现窗口吸附屏幕边缘 自动收缩
  • shell脚本之免交互
  • Ajax入门与使用
  • 蓝桥杯备战——11.NE555测频
  • 代码随想录算法训练营第三十三天|509. 斐波那契数 ,● 70. 爬楼梯 , 746. 使用最小花费爬楼梯
  • Node.js 文件系统操作指南
  • Kotlin 协程1:深入理解withContext
  • (自用)learnOpenGL学习总结-高级OpenGL-几何着色器
  • 坚持刷题 | 完全二叉树的节点个数
  • K8S网络