element-tree 实现部门-人员选择(支持ID相同)

article/2025/7/12 17:33:41

使用element-tree实现id相同的选择

  1. 相同人员可在不同部门出现, 当勾选其中一个人员时,其它部门的相同人员也要勾选上
  2. 右侧可进行删除已勾选人员, 并且树状图勾选状态取消
  3. 若有勾选,进入时候默认选中

效果如下:
例如: 点击勾选总经办的王五,技术部的王五也要勾选上,右侧删除王五的时候,左侧相关王五的勾选全部取消在这里插入图片描述
因为element-tree出现重复id的时候,会导致被覆盖,只能勾选中一个,
解决方案: 修改element-ui tree的源码
tree-store.js 文件 仿照源码增加了两个自定义的方法

export default class TreeStore {constructor(options) {this.currentNode = null;this.currentNodeKey = null;for (let option in options) {if (options.hasOwnProperty(option)) {this[option] = options[option];}}this.nodesMap = {};//mycodethis.myNodesMap = [];this.root = new Node({data: this.data,store: this});if (this.lazy && this.load) {const loadFn = this.load;loadFn(this.root, (data) => {this.root.doCreateChildren(data);this._initDefaultCheckedNodes();});} else {this._initDefaultCheckedNodes();}}//mycodesetMyChecked(data, checked, deep) {const nodes = this.getMyNode(data);if (nodes && nodes.length > 0) {for (let index = 0; index < nodes.length; index++) {const element = nodes[index];let node = Object.values(element)[0];if (node&&(node.checked!==checked)) {node.setChecked(!!checked, deep);}}}}//mycodegetMyNode(data) {const key = typeof data !== 'object' ? data : getNodeKey(this.key, data);const result = this.myNodesMap.filter(item => item[key]);return result || [];}registerNode(node) {const key = this.key;if (!key || !node || !node.data) return;const nodeKey = node.key;if (nodeKey !== undefined) this.nodesMap[node.key] = node;//mycodeif (nodeKey !== undefined) {this.myNodesMap.push({[node.key]: node});}}

tree.vue 文件增加自定义设置的方法

   //mycodesetMyChecked(data, checked, deep) {this.store.setMyChecked(data, checked, deep);},

注意: 由于更改了依赖的源码 需要额外进行处理 我在这的处理方法是 : 将ele 的tree复制单独使用lib文件夹存放
因为修改了依赖 使用了自定义的方法,直接改动依赖打印东西,是没有任何效果的,需要进行引入组件再打印

//代码有删减
<template><div><div class="distribution"><div class="people"><div class="search"><el-inputplaceholder="请输入内容"v-model="filterText"clearableclass="input-with-select"><el-button slot="append" icon="el-icon-search" @click="filterNode"></el-button></el-input><el-buttontype="primary"class="refreshico"icon="el-icon-refresh-left"size="mini"@click="handleAsync">同步数据</el-button></div><div class="tree"><el-treeclass="filter-tree":data="depData":props="defaultProps"default-expand-allhighlight-currentnode-key="id":expand-on-click-node="false":filter-node-method="filterNode"@check-change="handleCheckChange"ref="tree"show-checkbox></el-tree></div></div><div class="selectPeople"><div><span class="selectText">已选员工</span><div class="delAll" @click="delAll">清空</div></div><ul><li v-for="(item, index) in selectList" :key="index"><span>{{ item.workDeptId }}</span><div @click="handleDelSelect(item)">x</div></li></ul></div></div><div class="tree_btn"><el-button type="danger"  @click="handleCancel">取消</el-button><el-button type="primary"  @click="save">确认</el-button></div></div>
</template><script>
import ElTree from "@/lib//tree/src/tree.vue";
import peopelList from './index.json';
export default {props: ["selectUserIdList"],components: {ElTree,},data() {return {isDel: false,depData: [],checkedKeyList: [],selectList: [],defaultProps: {children: "childrenDepartmentList",label: "workDeptId",},distribution: false,agentConfigSuccess: false,queryParams: {},filterText:'',};},methods: {// 选择员工内的删除handleDelSelect(data) {this.$refs.tree.setMyChecked &&this.$refs.tree.setMyChecked(data, false, true);},//去重,因为相同人员可以在不同部门出现,右侧进行渲染只渲染一个名字unique(arr) {const res = new Map();return arr.filter((a) => !res.has(a.workDeptId) && res.set(a.workDeptId, 1) && a.type === 'user');},// 多选框选中handleCheckChange(data, checked, indeterminate) {//设置选择框状态data.id &&this.$refs.tree.setMyChecked &&this.$refs.tree.setMyChecked(data, checked, true);//右边渲染列表let workDeptIds = this.$refs.tree.getCheckedNodes().filter((item) => item.id && item.childrenDepartmentList.length === 0);this.selectList = this.unique(workDeptIds);},filterNode(value, data) {if (!value) return true;return data.workDeptId.indexOf(value) !== -1;},//因为我这里初始默认选中的数据结构和 部门列表的数据结构不一致,所以我进行了多一层处理//将初始默认选中的数据传入进行过滤,将过滤成功的数据进行勾选并渲染myFilter(value) {let _this = thisconst traverse = function (node) {const childNodes = node.root ? node.root.childNodes : node.childNodes;childNodes.forEach((child) => {if(child.data.workDeptId === value){_this.$refs.tree.setMyChecked(child.data, true, true);}traverse(child);});};traverse(this.$refs.tree);},// 取消handleCancel() {this.$emit("handleCancel", false);this.filterText = "";this.selectList = "";this.$refs.tree.setCheckedKeys([]);},// 清空已选员工delAll() {this.selectList = [];this.checkedKeyList = [];this.$refs.tree.setCheckedKeys([]);},save(){if(this.selectList.length){this.$emit('handleConfirm',this.selectList)}else{this.$message({showClose: true,message: '请选择员工',type: 'error'});}},},watch: {filterText(val) {let data = {userName:val.trim()}workServiceUser(data).then(res=>{if(res && res.data && res.data.length){res.data.map(item=>{this.$refs.tree.filter(item);})}else{this.$refs.tree.filter(val);}})},"selectUserIdList":{handler(){this.$nextTick(()=>{if(this.selectUserIdList && this.selectUserIdList.length){this.selectUserIdList.map(item=>{this.myFilter(item)})}})}},},
};
</script>       
														觉得赞的话可以打赏下哦~

在这里插入图片描述


http://chatgpt.dhexx.cn/article/5EAOl4es.shtml

相关文章

【Mobile Org】适用于移动端/H5的组织部门/角色/人员选择组件

Mobile Org Introduction 移动端组织架构数据选择方案&#xff0c;包括组织机构、角色以及人员等分类&#xff0c;支持单选、多选、关键字段自定义以及多种事件及插槽等&#xff0c;适用于大部分组织选人场景。 支持懒加载回调&#xff0c;点击获取当前组织下的子组织及人员…

使用VUE自定义组件封装部门选择功能

背景 照惯例&#xff0c;先交待下背景&#xff0c;从真实需求出发&#xff0c;讲述实现效果、设计思路和实现方式。 软件系统中&#xff0c;会有一些常见常用的选择功能&#xff0c;如部门选择、人员选择等&#xff0c;用于填报表单&#xff0c;使用频率很高。直接使用一方面会…

选择部门(多层级)下人员

一、顶部部门选中标题栏&#xff08;部门面包屑&#xff09; 1.使用水平滚动的ListView&#xff08;HorizontalListView&#xff09;&#xff0c;代码搜索一下就能找到&#xff0c; 2.右监听可以使用符号文字>&#xff08;代码&#xff1a;>&#xff09;&#xff0c;也…

阿里云成立13年首次实现年度盈利;iPhone14有望实现息屏显示;Android 13将采用华为研发的只读文件系统 |EA周报...

EA周报 2022年5月27日 每个星期7分钟&#xff0c;元宝带你喝一杯IT人的浓缩咖啡&#xff0c;了解天下事、掌握IT核心技术。 周报看点 1、成立13年首次年度盈利&#xff0c;阿里云2022财年赚11亿 2、博通官宣610亿美元收购VMware 3、Android 13 将默认采用华为开发的只读文件系统…

【ELT.ZIP】OpenHarmony啃论文俱乐部—数据密集型应用内存压缩

本文出自ELT.ZIP团队&#xff0c;ELT<>Elite(精英)&#xff0c;.ZIP为压缩格式&#xff0c;ELT.ZIP即压缩精英。成员&#xff1a; 上海工程技术大学大二在校生合肥师范学院大二在校生清华大学大二在校生成都信息工程大学大一在校生黑龙江大学大一在校生华南理工大学大一在…

Nydus 镜像扫描加速

文&#xff5c;余硕 上海交通大学22届毕业生 阿里云开发工程师 从事云原生底层系统的开发和探索工作。 本文 6369 字 阅读 16 分钟 GitLink 编程夏令营是在 CCF 中国计算机学会指导下&#xff0c;由 CCF 开源发展委员会&#xff08;CCF ODC&#xff09;举办的面向全国高校学生的…

定了,6大领域93个开源任务,阿里开源导师带你参与中科院开源之夏2022

今年&#xff0c;由阿里巴巴开源导师参与的30个核心开源社区再次加入中国科学院软件研究所开源软件供应链点亮计划支持下的系列高校开源活动——开源之夏2022&#xff0c;共开放93个开源任务。通过本活动&#xff0c;同学们可以在顶级开源导师的指导下&#xff0c;通过3个月的时…

龙蜥操作系统 Anolis OS 8.6 - 来自阿里云的 CentOS 8 100% 兼容发行版

请访问原文链接&#xff1a;https://sysin.org/blog/anolis-os-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org Anolis OS 8 是 OpenAnolis 社区推出的完全开源、中立、开放的发行版&#xff0c;它支持多计算架构&#x…

remove是什么意思计算机语言,remove是什么意思?remove是什么意思?

remove()是C语言中的函数&#xff0c;一般作用是删除数组、链表对象所有的元素。函数原型是intremove(char*filename)。 函数功能 remove()函数用于删除指定的文件&#xff0c;其原型如下&#xff1a; int remove(char *filename); 函数声明2&#xff1a; templateinline bool …

Linux 知:文件系统

文章目录 1. 前言2. 文件2.1. 一切皆文件2.2. 文件属性2.3. 目录结构2.4. 文件路径 3. 文件系统3.1. 文件系统种类3.2. 文件系统特性3.2.1. 格式化3.2.2. 格式 3.3. EXT 族文件系统3.3.1. EXT2 文件系统3.3.1.1. data block&#xff08;数据区块&#xff09;3.3.1.2. inode tab…

8 亿邮件地址泄露,源于邮件验证服务;腾讯推出微信公众号直播工具

(给技术最前线加星标&#xff0c;每天看技术热点) 转自&#xff1a;开源中国、solidot、cnBeta、腾讯科技、快科技等 【技术资讯】 0、8 亿邮件地址遭泄露&#xff0c;源于邮件验证服务 近日&#xff0c;Security Discovery 安全研究人员 Bob Diachenko 发现了一个150 GB 大小、…

LWN: 5.17 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦&#xff5e; 5.16 Merge window, part 1 By Jonathan CorbetNovember 4, 2021DeepL assisted translationhttps://lwn.net/Articles/874683/ 截止到撰写此文的时候&#xff0c;Linus Torvalds 已经为 5.16 版本内核而向内核合入了 6800 个 no…

Linux出现Read-only file system错误解决方法

执行命令时遇到如下错误 这个问题是文件系统受损导致得&#xff0c;fstab文件未正确配置 解决方法&#xff1a; df -hT  #查看一下分区及挂载信息 fsck -a /dev/sda3  -a &#xff1a;检查文件系统&#xff0c;有异常便自动修复 执行完毕之后重启服务器 reboot 进入服务器&…

只需 6 步,你就可以搭建一个云原生操作系统原型

编者按&#xff1a;过去的三年对基础软件领域来说是不平凡的三年&#xff0c;是波涛汹涌的三年。随着国际形势和行业格局的变化&#xff0c;大家一定充分感受到了云原生和操作系统这两个话题的热度。那么当云原生和操作系统这两个热点话题相遇的时候&#xff0c;会发生什么故事…

Linux 内核源代码情景分析(四)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 内核源代码情景分析&#xff08;一&#xff09; Linux 内核源代码情景分析&#xff08;二&#xff09; Linux 内核源代码情景分析&#xff…

TWS蓝牙耳机推荐哪个?2022国产无线蓝牙耳机推荐

随着各大手机厂商逐渐取消了传统的耳机插孔后&#xff0c;就有越来越多的人开始使用蓝牙耳机了。即使是过去一直觉得蓝牙耳机不太实用&#xff0c;最后也无法摆脱“真香理论”&#xff01;&#xff01;在蓝牙技术的快速发展的今天&#xff0c;蓝牙耳机在连接性能和音质方面取得…

女生小清新高颜值蓝牙耳机分享,低延迟高性价比TWS蓝牙耳机推荐

在电子竞技空前火热的今天,玩家对于游戏耳机的要求不仅仅停留在能听见声音的层面。特别是目前比较火热的射击类游戏对于游戏耳机的要求更加高,一款出色的游戏耳机可以让玩家在战场上“如虎添翼”,不仅如此,对于玩家而言,游戏时间基本两三个小时起步,因此长期佩戴的舒适性…

真无线蓝牙耳机什么牌子好?TWS蓝牙耳机推荐

蓝牙耳机的形态可以说是多种多样了&#xff0c;随着时代的发展&#xff0c;蓝牙耳机变成了我们不可或缺的东西&#xff0c;左右耳两只小小的耳机&#xff0c;搭配一个耳机仓。整个过程仅需要打开蓝牙就行&#xff0c;非常方便。那么在蓝牙耳机的带领下&#xff0c;什么款式的蓝…

2022TWS蓝牙耳机推荐,盘点600元真无线蓝牙耳机

近年来&#xff0c;随着蓝牙技术的发展和续航能力的提升&#xff0c;蓝牙耳机开始进入了"真"无线时代。在短短的几年内&#xff0c;TWS耳机成为了大家竞相占领的重要“城池”&#xff0c;各类蓝牙耳机如雨后春笋般出现。今天就来说说被各大网友推荐上榜单的音质好的蓝…

TWS蓝牙耳机哪些品牌好?TWS蓝牙耳机品牌排行榜

或许有很多人在挑选蓝牙耳机时候有所困扰&#xff0c;因为有一些蓝牙耳机动辄上千元&#xff0c;对于预算不足&#xff0c;对我朋友来说实在是头疼。每个人的需求不同&#xff0c;所以在挑选蓝牙耳机时候也会有所侧重。推荐几款平价蓝牙耳机&#xff0c;不足千元的价格&#xf…