el-tree包含下级回显半选状态一些问题

上一篇文章如何在el-tree懒加载并且包含下级的情况下进行数据回显-02
说了一下在包含下级的时候,数据的回显,通过nodesMap进行赋值,这次说一下在做这个需求的过程中遇到的一些问题:

loadNode(node, resolve) {// 处理回显主要是通过,store里面的nodesMap,nodesMap是一个对象,里面的键是id,值是id对应的node节点信息,包括是否全选checked, indeterminatethis.nodeStore = node.store || {};if (this.orgPower) {new Promise((_resolve) =>_resolve({data: {name: "总行",orgRefno: "01",},})).then((res) => {this.orgPower = false;this.powerOrgPk = res.data.orgRefno// 这里主要通过nodesMap来处理没有懒加载数据的回显// if (//   this.nodesMap[res.data.orgRefno] &&//   node.store.nodesMap[res.data.orgRefno]// ) {//   node.store.nodesMap[res.data.orgRefno].checked =//     this.nodesMap[res.data.orgRefno].checked;//   node.store.nodesMap[res.data.orgRefno].indeterminate =//     this.nodesMap[res.data.orgRefno].indeterminate;// }// // 这里主要是用来处理第一次是半选,没有点击展开按钮,加载数据,回显不了的问题// this.containlow &&//   node.store.nodesMap[res.data.orgRefno] &&//   (this.powerOrgPkIsIndeterminate =//     node.store.nodesMap[res.data.orgRefno].indeterminate);return resolve([res.data]);});} else {new Promise((_resolve) =>_resolve(this.handleNodeData(node.data.orgRefno))).then((res) => {return resolve(res.data);const { data = [] } = res;// 添加parentKey属性,以便于在左侧不选中数据的时候,将右侧下级的数据也取消掉const parentKey = [node.data && node.data.orgRefno || '']let parent = node.parent;while(parent && parent.data) {parentKey.push(parent.data && parent.data.orgRefno || '')parent = parent.parent}data.forEach(item => {item.parentKey = parentKey.join(',')})let superInNotSelect = false;// 如果上级没有进行选择(这里要改变一下treeCheckKeyList的数据)if(!node.checked && !node.indeterminate && this.containlow) {superInNotSelect = true;data.forEach(item => {// 这里处理一下 treeCheckKeyList, 因为这里有一个bug:在手动触发 checked事件的时候,nodesMap中的checked标识会根据是否选中进行改变/*** bug复现*  步骤一:第一级不选,第二级不选,第三级有一个是全选*  步骤二:第一级全选,第二级全不选(checked事件),会展开之前选中的第三级,这时候会发现,第三级会被莫名奇妙的选上(treeCheckKeyList包含第三级),第二级成半选状态*/// 注意这里处理treeCheckKeyList要在resolve方法之前const findIndex = this.treeCheckKeyList.findIndex(key => key === item.orgRefno)if(findIndex > -1) {this.treeCheckKeyList.splice(findIndex, 1)}})this.cacheSearchTreeData = this.leftSelectTreeData;}resolve(res.data);let num = 0;let sonHasIndeteminate = false;data.forEach((item) => {// 这里主要是通过 nodesMap来处理没有懒加载数据的回显if (this.nodesMap[item.orgRefno] &&node.store.nodesMap[item.orgRefno]) {// 回显全选node.store.nodesMap[item.orgRefno].checked =this.nodesMap[item.orgRefno].checked;// 回显半选this.containlow &&(node.store.nodesMap[item.orgRefno].indeterminate =this.nodesMap[item.orgRefno].indeterminate);if(this.containlow && node.store.nodesMap[item.orgRefno].indeterminate) {sonHasIndeteminate = true;}if ((this.containlow &&node.store.nodesMap[item.orgRefno].checked) ||node.store.nodesMap[item.orgRefno].indeterminate) {num++;}}// 这里主要用来处理右侧回显的问题,之前是通过点击复选框,进行右侧回显的,现在要做成点击复选框,子节点也跟着选中,所以要把子节点也要弄到已选列表里面if(this.containlow) {if(node.checked) {const index = this.leftSelectTreeData.findIndex(_item => _item.orgRefno === item.orgRefno)// 如果没有存在右侧,则将子节点添加进去if(index === -1) {this.leftSelectTreeData.push(item)}if(node.store.nodesMap[item.orgRefno]) {node.store.nodesMap[item.orgRefno].checked = truenode.store.nodesMap[item.orgRefno].indeterminate = true}} else {if(node.store.nodesMap[item.orgRefno] && !node.indeterminate) {node.store.nodesMap[item.orgRefno].checked = false}}}})// 这里主要用来处理是否半选(在没有懒加载的时候)// 这里这样处理主要是因为,有一个这样的bug,如果第一级是半选的状态,第二级只有一个半选的状态,那么第一级在点击的时候,半选状态在赋值的时候消失// 把这里注释掉,把 nodesMap改成 可以复现这个bug// nodesMap: {//   '01': { 'checked': false, indeterminate: true, name: '总行'},//   '0101': { 'checked': false, indeterminate: true, name: '测试0101'},//   '010101': { 'checked': true, indeterminate: true, name: '测试010101'}// }// 这里在这样处理的时候也会有一个问题// 这里需要增加一个变量来处理三层联动问题,如果第一级是半选,第二级也是半选,第三级也是半选,逐个向下点击,如果下级有一个是全选的,并且只有这一个,就会初选上层半选全会变成不选// this.containlow &&//   (node.indeterminate = num > 0 && num !== data.length);this.containlow &&(node.indeterminate = num > 0 && num !== data.length && !node.checked || sonHasIndeteminate);if (this.containlow && node.indeterminate) {// 这里处理的问题和上面的问题类似:如果是第一层是半选状态(没有全选状态),第二层级也是只有半选状态没有全选状态,第三层级也是这样// 展开第一层级没有问题,但是展开第二层级的时候,就会有第一层级的半选状态消失的问题let parent =node.store.nodesMap[node.data.orgRefno] &&node.store.nodesMap[node.data.orgRefno].parent;while (parent) {parent.indeterminate = true;parent = parent.parent;}}return;});}
},
  1. 为什么在展开下级的时候,上级勾选状态会受影响?
    因为下级数据勾选回显都是在resolve方法之后的,在执行resolve方法的时候,源码中有这样一个方法
this.loadData((data) => {if (data instanceof Array) {if (this.checked) {this.setChecked(true, true);} else if (!this.store.checkStrictly) {// 包含下级,会走这个方法reInitChecked(this);}done();}
});const reInitChecked = function(node) {if (node.childNodes.length === 0 || node.loading) return;const {all, none, half} = getChildState(node.childNodes);if (all) {node.checked = true;node.indeterminate = false;} else if (half) {node.checked = false;node.indeterminate = true;} else if (none) {// 这里会影响本级节点node.checked = false;node.indeterminate = false;}const parent = node.parent;if (!parent || parent.level === 0) return;if (!node.store.checkStrictly) {// 主要这里会影响父级reInitChecked(parent);}
};// 这个方法主要用来判断状态。
export const getChildState = node => {let all = true;let none = true;let allWithoutDisable = true;for (let i = 0, j = node.length; i < j; i++) {const n = node[i];if (n.checked !== true || n.indeterminate) {all = false;if (!n.disabled) {allWithoutDisable = false;}}if (n.checked !== false || n.indeterminate) {none = false;}}return { all, none, allWithoutDisable, half: !all && !none };
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13、RockerMQ消息类型之广播与集群消息

RocketMq中提供两种消费模式&#xff1a;集群模式和广播模式。 集群模式 集群模式表示同一个消息会被同一个消费组中的消费者消费一次&#xff0c;消息被负载均衡分配到同一个消费者上的多个实例上。 还有另外一种平均的算法是AllocateMessageQueueAveragelyByCircle&#xff…

CSS 的背景属性(开发中常用)

目录 1 内容预览 背景颜色 背景图片 背景平铺 背景图片位置(常用) 背景图像固定 背景复合写法 背景色半透明 实现案例 1 内容预览 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 注意&#xff1a; 把表格中的五个属背下来&#xff0c…

约数性质以及辗转相除法

文章目录 AcWing 869. 试除法求约数题目链接思路CODE AcWing 870. 约数个数题目链接思路CODE AcWing 871. 约数之和题目链接思路CODE AcWing 872. 最大公约数题目链接思路CODE AcWing 869. 试除法求约数 题目链接 https://www.acwing.com/activity/content/problem/content/9…

go集成nacos

1,go集成nacos 注册实例与注销实例 package mainimport ("fmt""github.com/nacos-group/nacos-sdk-go/clients""github.com/nacos-group/nacos-sdk-go/clients/naming_client""github.com/nacos-group/nacos-sdk-go/common/constant"…

【LuatOS】简单案例网页点灯

材料 硬件&#xff1a;合宙ESP32C3简约版&#xff0c;BH1750光照度模块&#xff0c;0.96寸OLED(4P_IIC)&#xff0c;杜邦线若干 接线&#xff1a; ESP32C3.GND — OLED.GND — BH1750.GND ESP32C3.3.3V — OLED.VCC — BH1750.VCC ESP32C3.GPIO5 — OLED.SCL — BH1750.SCL E…

AOP跨模块捕获异常遭CGLIB拦截而继续向上抛出异常

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、BUG详情 1.1 报错信息 1.2 接口响应信息 1.3 全局异常处理器的定义 二、排查过程 三、解决方案 四、总结 前言 最近&…

数据科学工作的20个Pandas函数(备忘)

Pandas 是数据科学社区中使用最广泛的库之一&#xff0c;它是一个强大的工具&#xff0c;可以进行数据操作、清理和分析。 本文将提供最常用的 Pandas 函数以及如何实际使用它们的样例。我们将涵盖从基本数据操作到高级数据分析技术的所有内容&#xff0c;到本文结束时&#xf…

Ubuntu 20.04安装禅道开源版

## Ubuntu 20.04安装禅道开源版 ## jerry 20231208 # 下载解压 cd /opt wget https://dl.cnezsoft.com/zentao/18.9/ZenTaoPMS-18.9-zbox_amd64.tar.gz tar xvzf ZenTaoPMS-18.9-zbox_amd64.tar.gz # 配置&#xff08;没啥可配的&#xff09; # 启动 启动所…

并发编程中的ConcurrentHashMap

对于ConcurrentHashMap相信大家很多的应用中都有用到&#xff0c;它的一些详细介绍各大博主都已经讲的详细的不能再详细了&#xff0c;接下来我们主要看下他的一些实现方法。 下面这个是我的应用中用到的&#xff0c;大家可以借鉴操作(可以做到即办即用) 目录 CSDN给的优缺点 …

攻防世界题目练习——Web引导模式(五)(持续更新)

题目目录 1. FlatScience2. bug3. Confusion1 1. FlatScience 参考博客&#xff1a; 攻防世界web进阶区FlatScience详解 题目点进去如图&#xff0c;点击链接只能看到一些论文pdf 用dirsearch和御剑扫描出一些隐藏文件&#xff1a; robots.txt: admin.php: login.php: f…

配电站房智慧化改造

随着科技的发展和工业化自动化的不断提高&#xff0c;传统的配电室已经不能满足现代工业的需求。配电站房的智慧化改造可以提高电力系统的运行效率和安全性&#xff0c;依托电易云-智慧电力物联网实现配电房无人值守。以下是配电站房智慧化改造的一些主要方面&#xff1a; 设备…

数据分享 I 全国市级商品房屋销售数据,shp/excel格式,2005-2020年数据

基本信息. 数据名称: 全国市级商品房屋销售数据 数据格式: Shp、excel 数据时间: 2005-2020年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1spxse商品房销售额&#xff08;亿元&#xf…

css 表示具有特定类或者其他属性的某种标签类型的元素

需求 通过 css 选择器获取某种标签&#xff08;如&#xff1a;div、input 等&#xff09;具有某个属性&#xff08;如&#xff1a;class、id 等&#xff09;的元素&#xff0c;从而修改其样式。 代码 通过 [标签].[属性] 的方式来获取 <div class"test">&l…

合封芯片开发就找宇凡微,提供合封芯片技术支持与资讯

一、引言 随着科技的迅速发展&#xff0c;芯片在各种电子设备中的地位日益凸显&#xff0c;其中越来越受关注的合封芯片给芯片和pcb厂商带来惊喜 合封芯片是指将多个芯片&#xff08;或其他电子元件&#xff09;封装在一个芯片封装体中的芯片。这种封装方式可以实现多个芯片的…

APP自动化测试工具大全

一、UI自动化测试工具 1. uiautomator2 openatx开源的ui自动化工具&#xff0c;支持Android和iOS。主要面向的编程语言是Python&#xff0c;API设计简洁易用&#xff0c;在开源社区也是很受欢迎。 安装&#xff1a; pip install --upgrade --pre uiautomator2# Or you can …

ArcGIS无法绘制一个或多个图层

背景&#xff1a;在导入一份数据时候&#xff0c;arcmap出现无法绘制一个或多个图层的错误&#xff0c;...点数少于要素所要求的的数量&#xff0c;查阅了半天资料发现是制作数据时候拓扑关系错误造成&#xff0c;现将处理方法详细记录如下&#xff1a; 1.原数据&#xff1a; …

北斗卫星助力消防救援实现精确升级

北斗卫星助力消防救援实现精确升级 在浙江省湖州市&#xff0c;当地消防支队建设了基于北斗系统的“智慧用水”等湖州市“智慧消防”综合信息指挥平台&#xff0c;初步实现了火灾精确预警、精确防范、精确指挥和精确处置。 湖州市“智慧用水系统”通过将北斗系统与地理信息管网…

199. 二叉树的右视图 --力扣 --JAVA

题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 解题思路 List添加元素的顺序可以作为树的层级&#xff1b;将树以根右左的顺序遍历&#xff1b;若当前层级已添加过元素则不…

plf::list原理分析

plf::list是一个比std::list性能要好的另外一种实现&#xff0c;根据作者的性能测试&#xff1a; 293% faster insertion 57% faster erasure 17% faster iteration 77% faster sorting 70% faster reversal 91% faster remove/remove_if 63% faster unique 811% faster clear …

【分享】7-Zip软件如何压缩文件?

7-Zip是一款完全免费的解压缩软件&#xff0c;不仅拥有自己独特的格式&#xff0c;还支持众多主流压缩格式&#xff0c;相比其他解压缩软件&#xff0c;它的压缩率更好&#xff0c;压缩速度更快。今天来分享一下如何使用7-Zip软件来压缩文件。 首先&#xff0c;我们可以到7-Zi…