react+antd 递归实现树状目录

本文介绍了前端小白如何通过递归处理数据和利用Ant Design的Tree组件,将后台平铺的数组数据转化为树状结构,并实现前端展示。详细讲述了数据格式化、组件格式设计以及在实际操作中遇到的问题和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.写在前面

作为前端小白的我一直对算法和数据结构浅尝辄止,哝,吃亏了。使用多次递归实现数据格式化后将数据进行树状展示的目的,分享一下我这次挠头的经历~

2.数据

后台传过来的数据大概是这样的

{
   
	"data":[
		{
   
			"id":1,
			"name":"一级节点",
			"parentId":0,
			"isValid":true,
			"canAddChild":true,
			"parent":null,
			"children":[]
		},{
   
			"id":3,
			"name":"二级节点",
			"parentId":1,
			"isValid":true,
			"canAddChild":true,
			"parent":null,
			"children":[
好的,我可以帮您实现。首先,我们需要安装Ant Design和umi,您可以通过以下命令安装它们: ``` npm install antd --save npm install umi --save ``` 然后,我们需要创建一个可搜索树形控件的组件。以下是一个简单的实现示例: ```tsx import React, { useState } from "react"; import { Tree, Input } from "antd"; import { DataNode } from "antd/lib/tree"; interface SearchableTreeProps { treeData: DataNode[]; } const { Search } = Input; const SearchableTree: React.FC<SearchableTreeProps> = ({ treeData }) => { const [expandedKeys, setExpandedKeys] = useState<string[]>([]); const [searchValue, setSearchValue] = useState<string>(""); // 递归过滤树节点 const filterTree = (tree: DataNode[], searchValue: string): DataNode[] => { return tree .filter((node) => node.title?.includes(searchValue)) .map((node) => ({ ...node, children: node.children ? filterTree(node.children, searchValue) : null, })); }; // 搜索框onChange事件 const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => { const value = e.target.value; const expandedKeys = treeData .map((node) => { if (node.title?.includes(value)) { return node.key; } if (node.children) { return filterTree(node.children, value).map((child) => child.key); } return null; }) .flat() .filter((key) => key) as string[]; setExpandedKeys(expandedKeys); setSearchValue(value); }; // 树节点展开事件 const handleExpand = (expandedKeys: string[]) => { setExpandedKeys(expandedKeys); }; return ( <div> <Search placeholder="Search" value={searchValue} onChange={handleSearch} /> <Tree treeData={filterTree(treeData, searchValue)} expandedKeys={expandedKeys} onExpand={handleExpand} /> </div> ); }; export default SearchableTree; ``` 我们可以使用以上组件,将数据传入treeData属性中即可实现可搜索的树形控件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值