react遞歸組件實現樹的示例詳解
需求點
在一些react項目中,常常有一些需要目錄樹這種結構,在很多ui組件庫中都有實現,但不知道實現的方式,下面可以根據遞歸組件來實現樹的操作
具體實現
1.數據結構定義
可以將組件的數據定義如下,其中key代表當前的節(jié)點key; content代表節(jié)點的內容;children代表子節(jié)點,子節(jié)點的數據結構與父節(jié)點一致
export type TreeProps = { key: string; content: React.ReactNode; children: TreeProps[]; };
2.實現組件
import { fakeData } from "./constant"; import { TreeProps } from "./type"; import "./tree.css"; const Tree = () => { return ( <div> {fakeData.map((item) => { return <TreeItem item={item} key={item.key} />; })} </div> ); }; const TreeItem = ({ item }: { item: TreeProps }) => { return ( <div className="tree-item"> <div className="content">{item.content}</div> {/* 如果子組件存在多個元素,就進行遞歸調用item子組件,不斷渲染其內容 */} {item.children.length > 0 && ( <> {item.children.map((child) => { return <TreeItem item={child} key={child.key} />; })} </> )} </div> ); }; export default Tree;
可以看到效果如下
可以看到基本上實現了文件樹的結構,下面我們實現反轉的功能
下載antd的圖標庫
npm install --save @ant-design/icons
在TreeItem組件中增加狀態(tài)控制樹的展開與關閉
const TreeItem = ({ item }: { item: TreeProps }) => { const [isOpen, setIsOpen] = useState(false); return ( <div className="tree-item"> <div className="content" onClick={() => setIsOpen(!isOpen)}> <> {item.children.length > 0 ? ( <> {isOpen ? ( <DownOutlined style={styles} /> ) : ( <RightOutlined style={styles} /> )} </> ) : ( <LineOutlined style={styles} /> )} </> <div>{item.content}</div> </div> {/* 如果子組件存在多個元素,就進行遞歸調用item子組件,不斷渲染其內容 */} {item.children.length > 0 && isOpen && ( <> {item.children.map((child) => { return <TreeItem item={child} key={child.key} />; })} </> )} </div> ); };
實現效果
總結
使用遞歸組件的方式實現了樹組件,了解其作用原理
在子組件內部實現其展開與關閉操作,可以避免在一些組件操作的時候,更新整個組件,提升了一定的性能
以上就是react遞歸組件實現樹的示例詳解的詳細內容,更多關于react樹的資料請關注腳本之家其它相關文章!
相關文章
react項目中express動態(tài)路由未能匹配造成的404問題解決
本文主要介紹了react項目中express動態(tài)路由未能匹配造成的404問題解決,解決了白屏的問題,具有一定的參考價值,感興趣的可以了解一下2023-09-09使用ReactJS實現tab頁切換、菜單欄切換、手風琴切換和進度條效果
這篇文章主要介紹了使用ReactJS實現tab頁切換、菜單欄切換、手風琴切換和進度條效果的相關資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2016-10-10