antd 的 Tree 控件没有提供点击展开的功能,只能通过左边的三角形实现展开和收起,没办法只好自己实现这个功能。
先看效果

如图实现的是类似 Mac 文件目录形式的结构,有箭头代表是个文件夹,点击展开文件夹,点击外层文件夹可以收起整个文件夹。
首先根据服务器返回的 Json 数据生成树形结构

const data = {name: "root",children: [{name: "a",value: "/a",children: [{name: "file_1",value: "/a/file_1"}, {name: "a_1",value: "/a/a_1",children: [{name: "file_2",value: "/a/a_1/file_2"}, {name: "file_3",value: "/a/a_1/file_3"}]}, {name: "a_2",value: "/a/a_2",children: [{name: "file_4",value: "/a/a_2/file_4"}, {name: "file_5",value: "/a/a_2/file_5"}]}]}, {name: "b",value: "/b",children: [{name: "b_1",value: "/b/b_1",children: [{name: "file_6",value: "/b/b_1/file_6"}]}]}]
}

数据结构中有 children 字段代表是个文件夹,因此需要递归遍历出 TreeNode 视图

import React from "react";
import Tree from 'antd/lib/tree';
import 'antd/lib/tree/style/css';const TreeNode = Tree.TreeNode;class TreeView extends React.Component {//遍历json绘制出tree结构mapData = (children) => {if (children && Array.isArray(children)) {return children.map((ele) => {if (ele.children && Array.isArray(ele.children)) {return <TreeNode title={ele.name} key={ele.value}>{this.mapData(ele.children)}</TreeNode>} else {return <TreeNode title={ele.name} key={ele.value}/>}})}return []}render() {let content = []let {name, children} = dataif (name) {content.push(<TreeNode title={name} key="/">{this.mapData(children)}</TreeNode>)}return (<Tree>{content}</Tree>);}
}export default TreeView

已经完成第一步,生成树形结构视图。接下来就是要实现点击展开树形结构

state = {expandedKeys: ["/"],autoExpandParent: true,selectedKeys: []}//选中的回调onSelect = (selectedKeys, obj) => {let {expandedKeys} = this.statelet selectedKey = this.state.selectedKeys//选中的状态if (obj.selected) {//判断是否已经展开,未展开就添加到 expandedKeys 中//已经展开就不用管let index = expandedKeys.indexOf(selectedKeys[0])if (index === -1) {expandedKeys.push(selectedKeys[0])this.setState({expandedKeys: expandedKeys,selectedKeys: selectedKeys})} else {this.setState({selectedKeys: selectedKeys})}// 没有 children 代表当前已没有下一级目录if (obj.event && obj.selectedNodes.length === 1 && !obj.selectedNodes[0].props.children) {//do something}} else {//selectedKey 是上次选中的元素 在 expandedKeys 肯定是存在的 //找到下标后需要过滤掉子类目录 例如上次选中的元素为 /a ,//子类 /a/a_1 已经展开就需要从 expandedKeys 中移除这个元素let index = expandedKeys.indexOf(selectedKey[0])if (index !== -1) {//过渡掉子类元素expandedKeys = expandedKeys.filter((ele) => {return !ele.includes(selectedKey[0])})this.setState({expandedKeys: expandedKeys,selectedKeys: []})} else {this.setState({selectedKeys: []})}}}//展开的回调onExpend = (expandedKey, obj) => {let {expandedKeys} = this.state//展开的状态if (obj.expanded) {this.setState({expandedKeys: expandedKey,selectedKeys: []})} else {//expandedKey 返回的是当前已经展开的元素 expandedKeys 是上次展开的元素//比较两个数组中缺少的元素得出当前被收起的是哪个元素let removeArray = this.diffArray(expandedKey, expandedKeys)//收起的时候需要把里面展开的元素一并移除,不然会造成收起动作无效expandedKeys = expandedKeys.filter((ele) => {return !ele.includes(removeArray[0])})this.setState({expandedKeys: expandedKeys,selectedKeys: []})}}//比较出2个数组中不一样的元素diffArray = (arr1, arr2) => {let arr3 = [];for (let i = 0; i < arr1.length; i++) {if (arr2.indexOf(arr1[i]) === -1)arr3.push(arr1[i]);}for (let j = 0; j < arr2.length; j++) {if (arr1.indexOf(arr2[j]) === -1)arr3.push(arr2[j]);}return arr3;}......render() {return (<TreeonExpand={this.onExpend}expandedKeys={this.state.expandedKeys}autoExpandParent={this.state.autoExpandParent}onSelect={this.onSelect}selectedKeys={this.state.selectedKeys}>{content}</Tree>)}

根index.js文件

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();

根APP组件

import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';
import TreeView from "./TreeView";class App extends Component {render() {return (<div className="App"><div className="App-header"><img src={logo} className="App-logo" alt="logo"/></div><div style={{marginTop: "100px"}}><TreeView/></div></div>);}
}export default App;

本文学习自:https://www.jianshu.com/p/d104f491b8c9

转载于:https://www.cnblogs.com/smart-girl/p/10782797.html

antd的Tree控件实现点击展开功能相关推荐

  1. element组件树形控件el-tree点击展开节点,节点重影

    本来想传视频看的清除一些,传不了视频,改gif格式还要下载软件算了 算了,凭手速截了这一张图. 先发现问题与解决 1.我是调用接口的时候发现的,有超级多的数据,本来以为我是数据多才出现这种问题, 2. ...

  2. element tree ui 全选_element UI tree 控件,点击父节点进行异步加载,异步加载的数据不能全选...

    异步加载不能有多级数据,异步的只能一级级加载 贴上我的代码 html :load="loadNode" node-key='id' lazy ref="tree" ...

  3. Flex使用mx:Tree控件创建树(可添加和删除节点)

    Flex使用<mx:Tree>控件创建树的在线运行效果见:http://tongqiuyan.blog.163.com/blog/static/1955453022011927102332 ...

  4. 在OnLButtonDown获取其他控件被点击的消息

    在网上找了一下,在群里网友说用什么hook,搜了一下,hook基本上截获鼠标或控件的消息,但是我是要实现在OnLButtonDown全局事件里捕获某控件被点击的消息,突然在CSDN中搜到了一篇说是可以 ...

  5. ElementUI tree控件如何取得被选中的节点,以及父节点(即使没被全选)

    ElementUI tree控件如何取得被选中的节点,以及父节点(即使没被全选) <el-tree:data="roleMenuData"node-key="id& ...

  6. WPF控件自定义点击事件

    WPF部分控件没有点击事件,点击,指的是鼠标按下,然后抬起,形成一次点击,这里写了个类,实现了点击事件如下 class ClickEventAction{static List<ClickEve ...

  7. Android控件默认点击效果

    Android控件默认点击效果 Android最简单的默认点击效果: android:background="?android:attr/selectableItemBackground&q ...

  8. layui如何获取父节点的父节点_element-ui tree控件获取当前节点和父节点

    今天使用element-ui 遇到两个问题,第一个问题是获取tree控件的当前节点和父节点, 一开始使用tree控件的getCurrentNode()函数,结果发现返回的是当前节点的data属性,和u ...

  9. ActiveReports 9 新功能:借助目录(TOC)控件为报表添加目录功能

    ActiveReports 9 新功能:借助目录(TOC)控件为报表添加目录功能 原文:ActiveReports 9 新功能:借助目录(TOC)控件为报表添加目录功能 在最新发布的ActiveRep ...

  10. Web控件文本框Reset的功能

    在前一篇中<怎样实现Web控件文本框Reset的功能>http://www.cnblogs.com/insus/p/4120889.html Insus.NET只实现了文本框的功能.单个或 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:自然语言处理与词嵌入
  2. 计算机专业PhD申请文书范文,美国留学博士申请文书怎么写之范文分享
  3. ORB-SLAM(四)追踪
  4. servlet——web应用中路径问题
  5. 厉害了,关于String的10道经典面试题
  6. python-数据类型-字符串入门-定符串的定义-type函数-iput函数
  7. golang CI: Use result of type assertion to simplify cases SCC-S1034
  8. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例
  9. C++ 中的深入浅拷贝和深拷贝
  10. 360更新补丁一直提示正在安装_Microsoft .NET Framework 4.7 安装失败,产生阻滞的问题...
  11. NYOJ760-See LCS again,有技巧的暴力!
  12. 天煌计算机组成原理控制软件,天煌THTJZ-2型计算机组成原理课程设计.doc
  13. 一款Spring Boot前后端分离的进销存综合管理系统源码
  14. Oracle 数据库生成2022年节假日表SQL
  15. The project uses Gradle 4.1 which is incompatible with Java 11 or newer.
  16. 用手机打开word图表位置很乱_9个工作中经常用到的Word技巧,能大大提升你的工作效率...
  17. 日程提醒app android,手机里有提醒日程安排的软件吗?
  18. vue-cropper图片裁剪 结合 OSS 实现图片直传(后台)
  19. cephadm全功能安装Ceph Pacfic
  20. App logo图标或内部icon的动态替换

热门文章

  1. python 倒计时功能怎么用print实现_在python中的print语句中实现60秒倒计时
  2. tbb::atomic和std::atomic的区别 废弃
  3. C++ 纯虚函数 虚函数 override
  4. 百度区块链 xuperchain 节点端 tps统计脚本
  5. Hyperledger Fabric教程(10)-- peer命令-链码chaincode
  6. docker用gpu的参数_Docker化部署(GPU)
  7. java ajax框架_ajax框架之 zk -demo1
  8. 一、JDK下载安装、eclipse下载安装(带资源)
  9. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_4_方法引用_通过super引用父类的...
  10. C语言编程-9_4 字符统计