亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

React實(shí)踐之Tree組件

chanthuang / 3353人閱讀

摘要:實(shí)踐之組件實(shí)現(xiàn)功能渲染數(shù)據(jù)展開(kāi)合并使用數(shù)據(jù)結(jié)構(gòu)引用代碼組件實(shí)現(xiàn)代碼這是點(diǎn)擊時(shí)調(diào)用的方法如果當(dāng)前這個(gè)沒(méi)有旋轉(zhuǎn),那就設(shè)置旋轉(zhuǎn),視覺(jué)效果點(diǎn)擊的時(shí)候設(shè)置當(dāng)前

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",
          }
        ]
      }
  ]
}

引用代碼:

組件實(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 (
                         {item.title}
                    )
        }else{
            return (
                 {item.title}
            )
        }
    }

    treeItemCroup(itemGroup) {
        let itemGroupItem = []
        // 每個(gè)元素的樣式,根據(jù)當(dāng)前等級(jí)來(lái)設(shè)置樣式,level1的就縮緊20px,level2的縮緊40px,一次類(lèi)推,在視覺(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(
            
    {/* 第一個(gè)層級(jí) */}
  • {this.itemTitle(itemGroup)}
  • {/* 調(diào)用tree方法 */} {this.tree(itemGroup.child)}
) 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 (
  • {this.itemTitle(item)}
  • {/* 如果當(dāng)前子元素還有子元素,就遞歸使用tree方法,把當(dāng)前子元素的子元素渲染出來(lái) */} {this.tree(item.child)}
) }) } return treeItem } render() { return (
{ this.treeItemCroup(this.props.treeList) }
); } } export default Tree;

效果圖:

DOM結(jié)構(gòu)圖


代碼我加了一些注釋,可能還是比較難理清楚邏輯 ?
當(dāng)前的邏輯我覺(jué)得有點(diǎn)混亂,希望看的朋友們能給出一點(diǎn)建議,感激不盡

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/88813.html

相關(guān)文章

  • 少婦白潔系列React StateUp Pattern, Explained

    摘要:本文用于闡述模式的算法和數(shù)學(xué)背景,以及解釋了它為什么是里最完美的狀態(tài)管理實(shí)現(xiàn)。歡迎大家討論和發(fā)表意見(jiàn)。 本文用于闡述StateUp模式的算法和數(shù)學(xué)背景,以及解釋了它為什么是React里最完美的狀態(tài)管理實(shí)現(xiàn)。 關(guān)于StateUp模式請(qǐng)參閱:https://segmentfault.com/a/11... P-State, V-State 如果要做組件的態(tài)封裝,從組件內(nèi)部看,存在兩種不同的...

    20171112 評(píng)論0 收藏0
  • 前端每周清單第 50 期: AngularJS and Long Term Support, Web

    摘要:在該版本發(fā)布之后,開(kāi)發(fā)團(tuán)隊(duì)并不會(huì)繼續(xù)發(fā)布新的特性,而會(huì)著眼于進(jìn)行重大的錯(cuò)誤修復(fù)。發(fā)布每六個(gè)星期,團(tuán)隊(duì)就會(huì)創(chuàng)建新的分支作為發(fā)布通道,本文即是對(duì)新近發(fā)布的版本進(jìn)行簡(jiǎn)要介紹。 showImg(https://segmentfault.com/img/remote/1460000013229009); 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為新聞熱...

    DobbyKim 評(píng)論0 收藏0
  • webpack 基礎(chǔ)與項(xiàng)目?jī)?yōu)化實(shí)踐總結(jié)

    摘要:前言本文基于,主要涉及基本概念基本配置和實(shí)際項(xiàng)目打包優(yōu)化。關(guān)于概念方面參考官網(wǎng),常用配置來(lái)自于網(wǎng)絡(luò)資源,在文末有相關(guān)參考鏈接,實(shí)踐部分基于自己的項(xiàng)目進(jìn)行優(yōu)化配置。同一文件中,修改某個(gè)影響其他。 前言:本文基于weboack4.x,主要涉及webpack4 基本概念、基本配置和實(shí)際項(xiàng)目打包優(yōu)化。關(guān)于概念方面參考官網(wǎng),常用配置來(lái)自于網(wǎng)絡(luò)資源,在文末有相關(guān)參考鏈接,實(shí)踐部分基于自己的項(xiàng)目進(jìn)行...

    Scorpion 評(píng)論0 收藏0
  • 我為什么從Redux遷移到了Mobx

    摘要:需要注意的是,在中,需要把數(shù)據(jù)聲明為。同時(shí)還提供了運(yùn)行時(shí)的類(lèi)型安全檢查。在利用了,使異步操作可以在一個(gè)函數(shù)內(nèi)完成并且可以被追蹤。例如在中,數(shù)組并不是一個(gè),而是一個(gè)類(lèi)的對(duì)象,這是為了能監(jiān)聽(tīng)到數(shù)據(jù)下標(biāo)的賦值。 Redux是一個(gè)數(shù)據(jù)管理層,被廣泛用于管理復(fù)雜應(yīng)用的數(shù)據(jù)。但是實(shí)際使用中,Redux的表現(xiàn)差強(qiáng)人意,可以說(shuō)是不好用。而同時(shí),社區(qū)也出現(xiàn)了一些數(shù)據(jù)管理的方案,Mobx就是其中之一。 R...

    DevYK 評(píng)論0 收藏0
  • 漫談前端性能 突破 React 應(yīng)用瓶頸

    摘要:表示調(diào)用棧在下一將要執(zhí)行的任務(wù)。兩方性能解藥我們一般有兩種方案突破上文提到的瓶頸將耗時(shí)高成本高易阻塞的長(zhǎng)任務(wù)切片,分成子任務(wù),并異步執(zhí)行這樣一來(lái),這些子任務(wù)會(huì)在不同的周期執(zhí)行,進(jìn)而主線程就可以在子任務(wù)間隙當(dāng)中執(zhí)行更新操作。 showImg(https://segmentfault.com/img/remote/1460000016008111); 性能一直以來(lái)是前端開(kāi)發(fā)中非常重要的話題...

    whlong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<