React實(shí)踐之Tree組件的使用方法
本文介紹了React實(shí)踐之Tree組件,分享給大家,具體如下:
實(shí)現(xiàn)功能
- 渲染數(shù)據(jù)
- 展開(kāi)合并
使用
數(shù)據(jù)結(jié)構(gòu):
const node = { title: '00000', key: '0' , level:'level1', open: true, child:[ { title: '0-111111', key: '0-0', level:'level2', open: true, child:[ { title: '0-1-1111', key: '0-0-0', level:'level3', }, { title: '0-1-2222', key: '0-0-1', level:'level3', open: true, child: [ { title: '0-1-2-11111', key: '0-0-1-0', level:'level4', open: true, child: [ { title: '0-1-2-1-111', key: '0-0-1-0-0', level:'level5', } ] } ] }, { title: '0-1-33333', key: '0-0-4', level:'level3', }, ] }, { title: '0-222222', key: '0-2', level:'level2', open: false, child: [ { title: '0-2-1111', key: '0-2-0', level:'level3', }, { title: '0-2-22222', key: '0-2-1', level:'level3', }, { title: '0-2-33333', key: '0-2-2', level:'level3', } ] } ] }
引用代碼:
<div> <Tree treeList = {node} /> </div>
組件實(shí)現(xiàn)代碼:
import React, { Component } from 'react'; import classNames from 'classnames'; const history = createHistory(); import { BrowserRouter as Router, HashRouter, Route, Link, Switch, NavLink } from 'react-router-dom'; class Tree extends Component { constructor(props){ super(props) this.treeItemCroup = this.treeItemCroup.bind(this); this.handleClick = this.handleClick.bind(this); this.state ={ openList : false } } handleClick(e) { // 這是點(diǎn)擊➡️ 時(shí)調(diào)用的方法 // 如果當(dāng)前這個(gè)➡️ 沒(méi)有旋轉(zhuǎn),那就設(shè)置旋轉(zhuǎn),視覺(jué)效果 e.target.style.transform = e.target.style.transform == "rotate(-90deg)" ? "rotate(0deg)" : "rotate(-90deg)" for(let item in e.target.parentNode.parentNode.childNodes){ // 點(diǎn)擊的時(shí)候設(shè)置當(dāng)前層級(jí)的子元素素隱藏 // 操作了DOM,我很難受 if(item > 0){ e.target.parentNode.parentNode.childNodes[item].style.display = e.target.parentNode.parentNode.childNodes[item].style.display === 'none' ? 'block' : 'none' } } } itemTitle(item){ // 這個(gè)是返回title,因?yàn)橛袝r(shí)候是點(diǎn)擊一個(gè)鏈接,所以設(shè)置了兩種情況,如果node節(jié)點(diǎn)里面有component這個(gè)節(jié)點(diǎn),那就設(shè)置成可以點(diǎn)擊跳轉(zhuǎn) if(item.component){ return (<Link to={ item.component } > <span onClick={this.handleClick.bind(this)}>{item.title}</span> </Link>) }else{ return ( <span onClick={this.handleClick.bind(this)}>{item.title}</span> ) } } treeItemCroup(itemGroup) { let itemGroupItem = [] // 每個(gè)元素的樣式,根據(jù)當(dāng)前等級(jí)來(lái)設(shè)置樣式,level1的就縮緊20px,level2的縮緊40px,一次類推,在視覺(jué)上呈現(xiàn)樹(shù)的形式 let itemStyle = { paddingLeft: 20*parseInt(itemGroup.level.slice(5), 10)+'px' } // 如果當(dāng)前節(jié)點(diǎn)還有子元素,就設(shè)置一個(gè)➡️ 箭頭 ,可以點(diǎn)擊展開(kāi)。 let iconChevron = classNames('fa',{'fa-chevron-down' : itemGroup.child}) // 把所有節(jié)點(diǎn)放在一個(gè)數(shù)組里面 itemGroupItem.push( <ul> {/* 第一個(gè)層級(jí) */} <li className={itemGroup.level} key={itemGroup.key} style={itemStyle}> <i aria-hidden="true" className={iconChevron} onClick={this.handleClick.bind(this)}></i> {this.itemTitle(itemGroup)} </li> {/* 調(diào)用tree方法 */} {this.tree(itemGroup.child)} </ul> ) return itemGroupItem } tree(child){ let treeItem // 如果有子元素 if(child){ // 子元素是數(shù)組的形式,把所有的子元素循環(huán)出來(lái) treeItem = child.map((item, key) => { // 同理,設(shè)置樣式 let itemStyle = { paddingLeft: 20*parseInt(item.level.slice(5), 10)+'px' } // 同理,設(shè)置➡️ let iconChevron = classNames('fa',{'fa-chevron-down' : item.child}) return ( <ul> <li className={item.level} key={key} style={itemStyle}> <i aria-hidden="true" className={iconChevron} onClick={this.handleClick.bind(this)}></i> {this.itemTitle(item)} </li> {/* 如果當(dāng)前子元素還有子元素,就遞歸使用tree方法,把當(dāng)前子元素的子元素渲染出來(lái) */} {this.tree(item.child)} </ul> ) }) } return treeItem } render() { return ( <div className="tree"> { this.treeItemCroup(this.props.treeList) } </div> ); } } export default Tree;
效果圖:
DOM結(jié)構(gòu)圖
代碼我加了一些注釋,可能還是比較難理清楚邏輯 😫
當(dāng)前的邏輯我覺(jué)得有點(diǎn)混亂,希望看的朋友們能給出一點(diǎn)建議,感激不盡
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談React組件props默認(rèn)值的設(shè)置
本文主要介紹了淺談React組件props默認(rèn)值的設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04使用useImperativeHandle時(shí)父組件第一次沒(méi)拿到子組件的問(wèn)題
這篇文章主要介紹了使用useImperativeHandle時(shí)父組件第一次沒(méi)拿到子組件的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08react+antd 遞歸實(shí)現(xiàn)樹(shù)狀目錄操作
這篇文章主要介紹了react+antd 遞歸實(shí)現(xiàn)樹(shù)狀目錄操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11React?Native性能優(yōu)化指南及問(wèn)題小結(jié)
本文將介紹在React?Native開(kāi)發(fā)中常見(jiàn)的性能優(yōu)化問(wèn)題和解決方案,包括ScrollView內(nèi)無(wú)法滑動(dòng)、熱更新導(dǎo)致的文件引用問(wèn)題、高度獲取、強(qiáng)制橫屏UI適配、低版本RN適配iOS14、緩存清理、navigation參數(shù)取值等,感興趣的朋友一起看看吧2024-01-01使用React?Redux實(shí)現(xiàn)React組件之間的數(shù)據(jù)共享
在復(fù)雜的React應(yīng)用中,組件之間的數(shù)據(jù)共享是必不可少的,為了解決這個(gè)問(wèn)題,可以使用React?Redux來(lái)管理應(yīng)用的狀態(tài),并實(shí)現(xiàn)組件之間的數(shù)據(jù)共享,在本文中,我們將介紹如何使用React?Redux實(shí)現(xiàn)Count和Person組件之間的數(shù)據(jù)共享,需要的朋友可以參考下2024-03-03Remix后臺(tái)開(kāi)發(fā)之remix-antd-admin配置過(guò)程
這篇文章主要為大家介紹了Remix后臺(tái)開(kāi)發(fā)之remix-antd-admin配置過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04react以create-react-app為基礎(chǔ)創(chuàng)建項(xiàng)目
這篇文章主要介紹了react以create-react-app為基礎(chǔ)創(chuàng)建項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03React?組件權(quán)限控制的實(shí)現(xiàn)
本文主要介紹了React?組件權(quán)限控制的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02