首页 > 其他分享 >【前端】- 在使用Element UI 的el-tree组件时,从底层去研究如何去实现一键展开/关闭【tree节点】的功能

【前端】- 在使用Element UI 的el-tree组件时,从底层去研究如何去实现一键展开/关闭【tree节点】的功能

时间:2024-03-29 17:32:45浏览次数:24  
标签:node el Element expanded tree label childNodes ref children

第一步:首先我们先去查看element ui官方文档,发现并没有提供这个方法,没办法,只能手写一个了,先给大家看看功能

点击前效果:

点击后效果:

第二步:废话不多说直接上代码,然后我们简单解释下代码

页面部分:这里是简单的数结构渲染,不多讲,$refs.Reftree获取的是el-tree的实例,具体作用请看下面的方法。

 <div style="width: 500px;height: 300px;border: 5px solid #eee;overflow: auto;margin: 0 auto;">
      <el-button type="primary" @click="El_treeExpand($refs.Reftree)">展开/折叠</el-button>
      <el-tree 
      ref="Reftree"
      :data="data" 
      :props="defaultProps" @node-click="handleNodeClick"></el-tree>
</div>
data: [{
          label: '一级 1',
          children: [{
            label: '二级 1-1',
            children: [{
              label: '三级 1-1-1'
            }]
          }]
        }, {
          label: '一级 2',
          children: [{
            label: '二级 2-1',
            children: [{
              label: '三级 2-1-1'
            }]
          }, {
            label: '二级 2-2',
            children: [{
              label: '三级 2-2-1'
            }]
          }]
        }, {
          label: '一级 3',
          children: [{
            label: '二级 3-1',
            children: [{
              label: '三级 3-1-1'
            }]
          }, {
            label: '二级 3-2',
            children: [{
              label: '三级 3-2-1'
            }]
          }]
        }],
        defaultProps: {
          children: 'children',
          label: 'label'
        },

方法部分:该方法传入el-tree实例,直接点击按钮即可实现展开或者关闭,这里简单讲解一下

1、ref.store.root.childNodes 通过实例来调用tree组件的方法,可以获取到所有的数据源

2、node.expanded 循环遍历出通过expanded属性来判断是否展开

3、expandNode 和 collapseNode 使用递归来进行控制展开属性

export function El_treeExpand(ref) {
    if (!ref) {
        this.$modal.alertWarning("未传入el-tree实例");
        return;
    }
    ref.store.root.childNodes.forEach((node, index) => {
   
        console.log(node.expanded);
        if (node.expanded) {
            collapseNode(node);
        } else {
            expandNode(node);
        }
    })
}
function expandNode(node) {
    node.expanded = true;
    if (node.childNodes) {
        node.childNodes.forEach(childNode => {
            expandNode(childNode);
        });
    }
}
function collapseNode(node) {
    node.expanded = false;
    if (node.childNodes) {
        node.childNodes.forEach(childNode => {
            collapseNode(childNode);
        });
    }
}

第三步:此时我们已经设置成功,进入页面进行测试一下

本来节点1.2是打开,3关闭,点击后就变成了1.2关闭,3打开了,还不是我们想要的效果

第四步:对代码进行简单的修改,思路是根据第一个节点的展开状态来决定所有的 

1、用来记录第一个节点的状态    let record = null;   

2、循环的过程中添加index,在index=0的时候,保存第一个节点值的状态

  if (index == 0) {
            record = node.expanded
        }

//全局 展开\折叠 el-tree方法   
//参数:ref (tree实例)
export function El_treeExpand(ref) {
    if (!ref) {
        this.$modal.alertWarning("未传入实例,报错位置utils/rhis.js 495");
        return;
    }
    let record = null; //记录第一个节点的状态
    ref.store.root.childNodes.forEach((node, index) => {
        //第一个是打开就所有打开,第一个是关闭就所有的关闭
        if (index == 0) {
            record = node.expanded
        }
        console.log(record);
        if (record) {
            collapseNode(node);
        } else {
            expandNode(node);
        }
    })
}
function expandNode(node) {
    node.expanded = true;
    if (node.childNodes) {
        node.childNodes.forEach(childNode => {
            expandNode(childNode);
        });
    }
}
function collapseNode(node) {
    node.expanded = false;
    if (node.childNodes) {
        node.childNodes.forEach(childNode => {
            collapseNode(childNode);
        });
    }
}

修改完成,测试效果

我们将第1.3节点设置为展开状态,第2节点设置为关闭状态

点击展开/折叠按钮,此时按照逻辑,根据第一节点的展开状态,所以点击之后所有的节点都会关闭

通过反复测验:成功搞定,方法可以注册到全局,在使用的页面传入ref实例就行了

下面是作者推荐的几篇文章,都是基础知识,有兴趣的都可以试试呀,大家共同学习,都很简单,都很实用

1. 发布WebApi到IIS服务的基本操作,小白必看篇

WebApi发布到IIS服务器的流程-详细解析-百分之百成功_webapi服务器-CSDN博客

2.发布WebApi到IIS服务出现访问权限的问题,已解决,详细请看下面文章

解决:WebApi发布到IIS服务器时,出现的HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效。_无法访问请求的页面,因为该页的相关配置数据无效。-CSDN博客

3.(入门级)开发第一个Java程序,只需要跟着做一遍就能理解Java程序运行的原理了

(入门级)开发第一个Java程序,只需要跟着做一遍就能理解Java程序运行的原理了-CSDN博客

标签:node,el,Element,expanded,tree,label,childNodes,ref,children
From: https://blog.csdn.net/2302_78387246/article/details/137117918

相关文章

  • 2.java openCV4.x 入门-hello OpenCV
    专栏简介......
  • ELK保留策略
    ELK(Elasticsearch,Logstash,Kibana)是一套用于日志管理和分析的开源工具。在Elasticsearch中,数据保留策略通常是通过索引生命周期管理(ILM)来实现的。以下是一个基于ILM的ELK保留策略的示例配置:首先,确保Elasticsearch已经启用了ILM功能。接下来,创建一个ILM策略,定义保留行为:......
  • SPEL表达式注入分析
    环境依赖<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.1.9.RELEASE</version></dependency></d......
  • A Systematic Survey of Prompt Engineering in Large Language Models: Techniques a
    本文是LLM系列文章,针对《ASystematicSurveyofPromptEngineeringinLargeLanguageModels:TechniquesandApplications》的翻译。大型语言模型中提示工程的系统综述:技术与应用摘要1引言2提示工程3结论摘要提示工程已经成为扩展大型语言模型(LLM)和视......
  • Large Language Models As Evolution Strategies
    本文是LLM系列文章,针对《LargeLanguageModelsAsEvolutionStrategies》的翻译。作为进化策略的大型语言模型摘要1引言2相关工作3背景4将LLMS转化为ES算法5LLMS作为零样本进化策略6EVOLLM消融研究7EVOLLM与教师微调8讨论摘要大型Transformer模......
  • Channel-Wise Autoregressive Entropy Models For Learned Image Compression
    目录简介创新点模型框架信道条件熵模型实验&结果简介熵约束自动编码器的熵模型同时使用前向适应和后向适应。前向自适应利用边信息,可以被有效加入到深度网络中。后向自适应通常基于每个符号的因果上下文进行预测,这需要串行处理,这妨碍了GPU/TPU的有效利用。创新点本文引......
  • ELK安装部署
     java环境#创建目录mkdir/usr/local/java/#解压tar-zxvfjdk-8u333-linux-x64.tar.gz-C/usr/local/java/#配置环境变量vim/etc/profileexportexportJAVA_HOME=/usr/local/java/jdk1.8.0_211exportJRE_HOME=${JAVA_HOME}/jreexportCLASSPATH=.:${JAVA_......
  • 使用cmd或PowerShell计算文件夹中的文件数量
    一、echo"CD需统计目录(PowerShell命令)"echo"1.统计文件和文件夹数(不会递归工作,只计算第一级元素)"(Get-ChildItem|Measure-Object).Countecho"2.统计文件夹数(不会递归工作,只计算第一级元素)"(Get-ChildItem-Directory|Measure-Object).Countecho"3.统计文件夹中的......
  • 肖sir__ python自动化之selenium9.1
    python+seleniumselenium是一个第三方库,python有很多库;1、什么是ui自动化?通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。2、ui自动化的有点?(1)解决重复性的功能测试和验证(2)减少测试人员在回归测试时用例漏测和验证点的漏测(3)减少冒烟测试,回归测试的......
  • 使用new[]后使用delete[]根本原因
    需要分情况讨论:以下环境为Ubuntu20.04g++9.4.0当数据是基本数据类型时,由于没有析构函数,所以系统没有必要记录数组大小。所以new[]后的指针就是实际申请内存大小,所以delete与delete[]没有区别,以下代码是不会抛出申请与释放指针不一致异常#include<iostream>intmai......