本文介绍了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"}
]
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文件的数据,在实际的交互中可根据自己输入的名称去请求后台对应的数据即可)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持
# react
# 树形组件
# ReactJs
# 树形结构
# react 权限树形结构实现代码
# 使用React封装一个Tree树形组件的实例代码
# React 递归手写流程图展示树形数据的操作方法
# React Ant Design树形表格的复杂增删改操作
# React 树形组件Tree View的具体使用
# 目录下
# 将该
# 夹中
# 给大家
# 便可
# 请输入
# 搜索结果
# 正常运行
# 大家多多
# 清空
# 全选
# 输入框
# 搜索关键字
# 可根据
# 小三角
# 在实际
# data
# _renderTreeNode
# JSON
# return
相关文章:
建站之星后台管理:高效配置与模板优化提升用户体验
西安大型网站制作公司,西安招聘网站最好的是哪个?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
如何在Windows服务器上快速搭建网站?
一键网站制作软件,义乌购一件代发流程?
招商网站制作流程,网站招商广告语?
建站之星如何一键生成手机站?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何在香港免费服务器上快速搭建网站?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
如何通过虚拟主机快速搭建个人网站?
常州企业建站如何选择最佳模板?
,sp开头的版面叫什么?
代刷网站制作软件,别人代刷火车票靠谱吗?
如何用狗爹虚拟主机快速搭建网站?
如何通过可视化优化提升建站效果?
建站org新手必看:2024最新搭建流程与模板选择技巧
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
香港服务器如何优化才能显著提升网站加载速度?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
建站主机如何安装配置?新手必看操作指南
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
网站app免费制作软件,能免费看各大网站视频的手机app?
临沂网站制作公司有哪些,临沂第四中学官网?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
建站主机核心功能解析:服务器选择与网站搭建流程指南
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
江苏网站制作公司有哪些,江苏书法考级官方网站?
javascript中对象的定义、使用以及对象和原型链操作小结
如何通过FTP空间快速搭建安全高效网站?
如何选择美橙互联多站合一建站方案?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
如何在万网主机上快速搭建网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
南宁网站建设制作定制,南宁网站建设可以定制吗?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何获取开源自助建站系统免费下载链接?
,有什么在线背英语单词效率比较高的网站?
开封网站制作公司,网络用语开封是什么意思?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
建站主机是否等同于虚拟主机?
如何选择高效稳定的ISP建站解决方案?
长沙企业网站制作哪家好,长沙水业集团官方网站?
北京制作网站的公司,北京铁路集团官方网站?
如何通过虚拟主机空间快速建站?
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何通过虚拟主机快速完成网站搭建?
*请认真填写需求信息,我们会在24小时内与您取得联系。