视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ReactJs实现树形结构的数据显示的组件的示例
2020-11-27 22:32:36 责编:小采
文档

本文介绍了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; WOW) 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="https://www.gxlcms.com/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; WOW) 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="https://www.gxlcms.com/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="https://www.gxlcms.com/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="https://www.gxlcms.com/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: 8px; 
} 
.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"} 
] 

treeListData01.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"} 
] 

searchListData.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文件的数据,在实际的交互中可根据自己输入的名称去请求后台对应的数据即可)

 

下载本文
显示全文
专题