ReactJs 트 리 구조의 데이터 디 스 플레이 를 실현 하 는 구성 요소 의 예시

본 고 는 ReactJs 가 트 리 구 조 를 실현 하 는 데이터 디 스 플레이 구성 요소 의 예 시 를 소개 하고 구체 적 으로 다음 과 같다.
1.이 구성 요소 트 리 디 스 플레이 데이터
2.구성 요소 의 데이터 요청 방식 은 fetch 방식 입 니 다.
3.대응 하 는 데이터 앞의 작은 삼각형 을 클릭 하고 fetch 는 데이터 에 대응 하 는 하위 데 이 터 를 바 꾸 고 이 노드 를 펼 치 기 를 요청 합 니 다.
4.이 구성 요소 의 js,less 파일 을 kpitree 디 렉 터 리 에 두 고 kpitree 디 렉 터 리 에 images 디 렉 터 리 를 만들어 구성 요소 에 필요 한 그림 을 디 렉 터 리 에 넣 고 kpitree 디 렉 터 리 에 json 폴 더 를 만들어 이 구성 요소 에 필요 한 json 파일 을 변경 폴 더 에 넣 으 면 구성 요소 가 정상적으로 실 행 됩 니 다.
kpiTree.js 파일

 /** 
 * Created by Administrator on 2017/3/20 0020. 
 */ 
import React,{Component} from "react" 
import "./kpiTree.less"; 
export default class KpiTree extends Component{ 
  constructor(props){ 
    super(props); 
    this.state={ 
    } 
    this._handleSelect=this._handleSelect.bind(this); 
    this._handleSearch=this._handleSearch.bind(this); 
    this._handleReturn=this._handleReturn.bind(this); 
  } 
  _handleSearch=()=>{ 
    debugger 
    var _self=this; 
    var _inputValue=this.refs.ksearchInput.value;//          
    var _main=this.refs.kpiTree; 
    _main.innerHTML=""; 
    var searchListUrl = '../src/kpiTree/json/searchListData.json'; 
    fetch(searchListUrl,{ 
      credentials:'same-origin', 
      async:false, 
      //method: 'POST', 
      method: 'GET', 
      mode:'cors',//     
      headers: { 
        "Content-type": "application/x-www-form-urlencoded", 
        "User-Agent": " Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" 
      }, 
    }) 
      .then(function(res) { 
        console.log("Response succeeded?", JSON.stringify(res.ok)); 
        return res.json(); 
      }) 
 
      .then(function(data) { 
        debugger 
        _self._renderTreeNode(_main,data,0); 
      }) 
      .catch(function(e) { 
        console.log("fetch fail",e.toString()); 
      }); 
  } 
  _handleReturn=()=>{ 
    this.refs.ksearchInput.value="";//        
    var _main=this.refs.kpiTree; 
    _main.innerHTML=""; 
    this._fetchTreeNodeData("",_main,0); 
  } 
  _handleSelect=()=>{ 
    debugger; 
    var _select=[]; 
    $(this.refs.kpiTree).find("input:checkbox").each(function() {//$('#kpiTree input:checkbox') 
      if ($(this)[0].pid!=undefined&&$(this)[0].checked ==true) { 
        var _selected_kpi={}; 
        _selected_kpi.kid=$(this)[0].parentNode.id.substring(4); 
        _selected_kpi.kname=$(this)[0].parentNode.children[1].innerHTML 
        _selected_kpi.pid=$(this)[0].parentNode.pid.substring(4); 
        _select.push(_selected_kpi); 
      } 
    }); 
    this.props.callbackParent(_select); 
  } 
  componentDidMount=()=>{ 
    var _main=this.refs.kpiTree; 
    this._fetchTreeNodeData("",_main,0); 
  } 
  _selectAllCheckBox=(parentNodeId,event)=>{ 
    var _items=$("#" + parentNodeId+" input") 
    for(var i=0;i<_items.length;i++){ 
      if (_items[i].pid!=undefined&&_items[i].pid==parentNodeId){ 
        _items[i].checked=event.currentTarget.checked; 
      } 
    } 
  } 
  _renderTreeNode=(nodeObj,treeData,paddingLeft)=>{ 
    var _self=this; 
    var hasAllSelectBox=false; 
    if(treeData.length>0){ 
      for(var i=0;i<treeData.length;i++){ 
        if(treeData[i].hasChild=="0"){ 
          hasAllSelectBox=true 
        } 
      } 
      var _node=treeData.map((data,index)=>{ 
        var _kname=data.kname; 
        var _div=document.createElement("div"); 
        _div.pid="node"+data.pid; 
        _div.id="node"+data.kid; 
        _div.style.paddingLeft=paddingLeft+"px"; 
        var _img=document.createElement("img"); 
        _img.src="/src/kpiTree/images/hide.png"; 
        _img.className="knode-hide-show-icon"; 
        _img.onclick=_self._handleClick.bind(this,data.kid); 
        var _checkBox=document.createElement("input"); 
        _checkBox.type="checkbox" 
        _checkBox.pid="node"+data.pid; 
        var _span=document.createElement("span"); 
        _span.innerHTML=_kname; 
        var allCheckBoxDiv=null; 
        if(data.pid!="-1"&&index==0&&hasAllSelectBox==true){ 
          allCheckBoxDiv=document.createElement("div"); 
          allCheckBoxDiv.pid="node"+data.pid; 
          allCheckBoxDiv.style.paddingLeft=paddingLeft+"px"; 
          var _allCheckBox=document.createElement("input"); 
          _allCheckBox.type="checkbox"; 
          _allCheckBox.onchange=_self._selectAllCheckBox.bind(this,nodeObj.id); 
          var _allCheckBoxLabel=document.createElement("span"); 
          _allCheckBoxLabel.innerHTML="  "; 
          allCheckBoxDiv.appendChild(_allCheckBox); 
          allCheckBoxDiv.appendChild(_allCheckBoxLabel); 
        } 
        if(data.hasChild=="1"){ 
          _div.appendChild(_img); 
        } 
        else if(data.hasChild=="0"){ 
          _div.appendChild(_checkBox); 
        } 
        _div.appendChild(_span); 
        if(allCheckBoxDiv){ 
          nodeObj.appendChild(allCheckBoxDiv) 
        } 
        nodeObj.appendChild(_div); 
      }) 
 
    } 
  } 
  _fetchTreeNodeData=(nodeId,nodeObj,paddingLeft)=>{ 
    debugger; 
    var _self=this; 
    var treeListUrl = '../src/kpiTree/json/treeListData'+nodeId+'.json'; 
    fetch(treeListUrl,{ 
      credentials:'same-origin', 
      async:false, 
      //method: 'POST', 
      method: 'GET', 
      mode:'cors',//     
      headers: { 
        "Content-type": "application/x-www-form-urlencoded", 
        "User-Agent": " Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" 
      }, 
    }) 
      .then(function(res) { 
        console.log("Response succeeded?", JSON.stringify(res.ok)); 
        return res.json(); 
      }) 
 
      .then(function(data) { 
        debugger 
        _self._renderTreeNode(nodeObj,data,paddingLeft); 
      }) 
      .catch(function(e) { 
        console.log("fetch fail",e.toString()); 
      }); 
 
  } 
  _handleClick=(nodeId,event)=>{ 
    debugger; 
    var _clickImg=event.currentTarget 
    var currentNode=event.currentTarget.parentNode; 
    if(_clickImg.src.indexOf("hide")!=-1){ 
      _clickImg.src="/src/kpiTree/images/show.png"; 
      if(currentNode.childNodes[3]!=null&¤tNode.childNodes[3]!=undefined){ 
        this._showOrHideNode(currentNode,1); 
      } 
      else { 
        this._fetchTreeNodeData(nodeId,currentNode,20); 
      } 
    } 
    else if(_clickImg.src.indexOf("show")!=-1){ 
      _clickImg.src="/src/kpiTree/images/hide.png"; 
      this._showOrHideNode(currentNode,0); 
    } 
  } 
  _showOrHideNode=(pNode,isShow)=>{ 
    var _sub_nodes=pNode.childNodes; 
    for(var i=0;i<_sub_nodes.length;i++){ 
      if(_sub_nodes[i].pid==pNode.id){ 
        if(isShow==1){ 
          _sub_nodes[i].style.display="block"; 
        } 
        else if(isShow==0){ 
          _sub_nodes[i].style.display="none"; 
        } 
      } 
    } 
  } 
  render=()=> { 
    var tabId=this.props.tabId; 
    var _kpiTreePanelHeight=tabId=="tab01"?"kpitree_panel_height_01":"kpitree_panel_height_02"; 
    var _bottomContentHeight=tabId=="tab01"?"kbottom-content_height_01":"kbottom-content_height_02"; 
    return ( 
      <div className={"kpitree_panel "+_kpiTreePanelHeight}> 
        <div className="ksearch-div"> 
          <input type="text" className="ksearch-input" ref="ksearchInput" placeholder="         "/> 
          <img className="ksearch-icon" src="/src/kpiTree/images/search-icon.png" onClick={this._handleSearch}/> 
          <div className="kreturn-button" onClick={this._handleReturn}> 
            <span>  </span> 
          </div> 
          <div className="kselecte-button" onClick={this._handleSelect}> 
            <span>    </span> 
          </div> 
        </div> 
        <div className={"kbottom-content "+_bottomContentHeight} ref="kpiTree"> 
        </div> 
      </div> 
    ); 
  } 
}; 
kpiTree.less 파일

.kpitree_panel{ 
 position: relative; 
 width:308px; 
 background-color: #F2F2F2; 
 border: 1px solid #cfcfcf ; 
} 
.kpitree_panel_height_01{ 
 height: 548px; 
} 
.kpitree_panel_height_02{ 
 height: 378px; 
} 
.ksearch-div{ 
 position: relative; 
 top: 10px; 
 margin-left: 4px; 
 width: 310px; 
 height: 30px; 
} 
.ksearch-input{ 
 border: 1px; 
 width: 145px; 
 height: auto; 
 border-radius: 10px; 
} 
.ksearch-icon{ 
 position: relative; 
 left: -24px; 
 width: 17px; 
 height: 17px; 
} 
.ksearch-button{ 
 position: relative; 
 left: 150px; 
 top: -22px; 
 font-size: 12px; 
 color: #999999; 
 padding-top: 3px; 
 text-align: center; 
 cursor: pointer; 
 width: 40px; 
 height:24px; 
 border: solid 0.8px #CBCBCB ; 
 -webkit-border-radius: 8px; 
} 
.kreturn-button{ 
 position: relative; 
 left: 171px; 
 top: -22px; 
 font-size: 12px; 
 color: #999999; 
 padding-top: 3px; 
 text-align: center; 
 cursor: pointer; 
 width: 40px; 
 height: 24px; 
 border: solid 0.8px #CBCBCB; 
 -webkit-border-radius: 8px; 
} 
.kselecte-button{ 
 position: relative; 
 left: 226px; 
 top: -46px; 
 font-size: 12px; 
 color: #999999; 
 padding-top: 3px; 
 text-align: center; 
 cursor: pointer; 
 width: 60px; 
 height: 25px; 
 border: solid 0.8px #CBCBCB; 
 -webkit-border-radius: 8px; 
 background-color: #F2F2F2; 
} 
.kbottom-content{ 
 padding: 10px; 
 color: #999999; 
 margin-left: 13px; 
 overflow-y: scroll; 
 overflow-x: hidden; 
 width: 280px; 
 margin-top: 20px; 
 background-color: #F7F7F7; 
} 
.kbottom-content_height_01{ 
 height: 480px; 
 } 
.kbottom-content_height_02{ 
 height: 318px; 
} 
.knode-hide-show-icon{ 
 width: 10px; 
 height: 10px; 
 cursor: pointer; 
} 
다음 json 파일 들 은 모두 json 폴 더 에 넣 습 니 다.
treeListData.json 파일

[ 
 {"kid":"01","kname":"    ","hasChild":"1","pid":"-1"}, 
 {"kid":"02","kname":"     ","hasChild":"1","pid":"-1"}, 
 {"kid":"03","kname":"    ","hasChild":"1","pid":"-1"}, 
 {"kid":"04","kname":"        ","hasChild":"1","pid":"-1"}, 
 {"kid":"05","kname":"2G  ","hasChild":"1","pid":"-1"} 
] 
treeListData 01.json 파일

[ 
 {"kid":"010","kname":"    1","hasChild":"1","pid":"01"}, 
 {"kid":"011","kname":"     1","hasChild":"1","pid":"01"}, 
 {"kid":"012","kname":"    1","hasChild":"1","pid":"01"}, 
 {"kid":"013","kname":"        1","hasChild":"1","pid":"01"}, 
 {"kid":"014","kname":"2G  1","hasChild":"1","pid":"01"} 
] 
treeListData010.json 파일

[ 
 {"kid":"0100","kname":"    000","hasChild":"0","pid":"010"}, 
 {"kid":"0101","kname":"     000","hasChild":"0","pid":"010"}, 
 {"kid":"0102","kname":"    000","hasChild":"0","pid":"010"}, 
 {"kid":"0103","kname":"        000","hasChild":"0","pid":"010"}, 
 {"kid":"0104","kname":"2G  000","hasChild":"0","pid":"010"} 
] 
searchList Data.json 파일

[ 
 {"kid":"01","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"02","kname":"     ","hasChild":"0","pid":"-1"}, 
 {"kid":"03","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"04","kname":"        ","hasChild":"0","pid":"-1"}, 
 {"kid":"05","kname":"2G  ","hasChild":"0","pid":"-1"}, 
 {"kid":"01","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"02","kname":"     ","hasChild":"0","pid":"-1"}, 
 {"kid":"03","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"04","kname":"        ","hasChild":"0","pid":"-1"}, 
 {"kid":"05","kname":"2G  ","hasChild":"0","pid":"-1"}, 
 {"kid":"01","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"02","kname":"     ","hasChild":"0","pid":"-1"}, 
 {"kid":"03","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"04","kname":"        ","hasChild":"0","pid":"-1"}, 
 {"kid":"05","kname":"2G  ","hasChild":"0","pid":"-1"}, 
 {"kid":"01","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"02","kname":"     ","hasChild":"0","pid":"-1"}, 
 {"kid":"03","kname":"    ","hasChild":"0","pid":"-1"}, 
 {"kid":"04","kname":"        ","hasChild":"0","pid":"-1"}, 
 {"kid":"05","kname":"2G  ","hasChild":"0","pid":"-1"} 
] 
트 리 구성 요소 가 실 행 된 결과:
 
검색 결과:(json 파일 을 요청 한 데이터 입 니 다.실제 대화 에서 자신 이 입력 한 이름 에 따라 배경 에 대응 하 는 데 이 터 를 요청 하면 됩 니 다)
 
이상 은 본문의 전체 내용 입 니 다.여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 도 저 희 를 많이 지지 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기