基于react可无限向内部添加节点的tree

这两天学习react,撸了一遍文档后开始自己动手写点东西。

正好从朋友那得到灵感,写一个小例子。

这个东西是这样的,就是点击的这个节点就往它里面添加一个child。

于是乎!我想到的就是用自调函数,递归的思想来实现。

看一下他啥样:

解释一下:

~点击【添加根节点】按钮的时候就添加一个父id为空的节点

~点击每一个节点的时候就在它的内部添加一个child

这里为了方便,我的state就写的固定的 = 。=!(强行解释一波:主要锻炼思想),如下:

 constructor(props){
    super(props);
    this.state={
      num:1,//用来记录新添加的id
      true_tree:[
        {name:"本id:1;父id:",id:1,pid:"",child:[]}
      ]
    };
    this.addTree=this.addTree.bind(this);
  }

页面上的渲染都是根据state里true_tree来决定的,所以,先看一下我是如何渲染的:

show(item){//用来根据true_tree里面的每一个child,循环出每一个子节点,传过来的参数item即为上一层的child
    let all = [];//创建一个容器,吧所有层的child都存在这里面一并返回
    item.forEach((items,index) => {//因为传过来的child是一个数组,所以需要遍历
          all.push(
            <div key={items.id} onClick={this.addTree.bind(this,items)}>
              {items.name}
              {items.child.length>0?this.show(items.child):""}
            </div>
           );
          //递归渲染,如果有child就再执行一遍show方法,渲染出所有child
    })
    return all;//将所有内容返回输出
  }

可以看到,我对渲染出来的div都绑定了一个事件“addTree”,这个方法就是往state中的true_tree中添加节点信息的方法,来看一下:

addTree(item,e){//直接往树里面添加
    e.stopPropagation();//防止事件冒泡,必须加上,不加就冒泡,会创建出重复id的节点
    let true_tree = this.state.true_tree;//获取到当前的树结构
    let sum = this.state.num+1;//新加的节点的id值
    let newItem={name:"本id:"+sum+";父id:"+(item==="root"?"":item.id),id:sum,pid:item==="root"?"":item.id,child:[]};//新的节点的详细数据
    if(item === "root"){//如果点击了的是添加根目录按钮(那个按钮传过来的是"root")
      true_tree.push(newItem);//则添加根节点
    }else{
      (function sort(t){//这是一个递归方法,如果根据pid在当前这层没找到他的父亲id,那么就去下一层找,还没找到就还去下一层
        t.forEach((items,index) => {
           if(newItem.pid === items.id){
            items.child.push(newItem);//如果找到了对应的父亲,就在这个父亲的child里面添加这个子节点
          }else{
            sort(items.child);//如果没找到调用本身去下一层找
          }
        })
    })(true_tree);//先从最高层开始根据pid寻找父亲id,所以穿true_tree
    }
    this.setState({//整个addTree方法结束,更新state
      num : sum,
      true_tree:true_tree
    })
  }

当然,一个组件少不了render,一家人就是要整整齐齐的,所以就贴出来吧~:

  render(){
    return(
      <div>
        <button onClick={this.addTree.bind(this,"root")}>添加根节点</button>
          {this.show(this.state.true_tree)}
      </div>
    )
  }

就这样,这个功能就实现了,其实就是一个用来控制数据的方法(addTree),一个用来控制渲染的方法(show)就完事了。

(当然,想让它变成一个可直接用的组件还需要修改,我发这一版的原因在于他还可以改成很多种组件,根据遇到的需求再改就可以了)

原文地址:https://www.cnblogs.com/sunchundong/p/9018418.html

时间: 2024-11-04 02:47:23

基于react可无限向内部添加节点的tree的相关文章

放弃antd table,基于React手写一个虚拟滚动的表格

缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反而有所上升. 客观地说,antd是开源的,UI设计得比较美观(甩出其他组件库一条街),而且是蚂蚁金服的体验技术部(一堆p7,p8,p9,基本都是大牛级的)在持续地开发维护,质量可以信任. 不过,antd虽好,但一些组件在某一些场景下,是很不适用的.例如,以表格形式无限滚动地展示大量数据(1w+)时,

React-Native(三):React Native是基于React设计的

React Native是基于React js设计的. 参考:<React 入门实例教程> React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单.所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具. 这个项目

基于react的nextjs服务端渲染框架学习使用

开发文档 https://nextjs.frontendx.cn/ 源码 该博客的示例代码我已经上传到github,欢迎star或者fork react-next-hello Next介绍 Next.js是一个基于React的一个服务端渲染简约框架.它使用React语法,可以很好的实现代码的模块化,有利于代码的开发和维护. Next.js带来了很多好的特性: 默认服务端渲染模式,以文件系统为基础的客户端路由 代码自动分隔使页面加载更快 (以页面为基础的)简洁的客户端路由 以webpack的热替换

27、任务二十四——选中、删除、添加节点

0.题目 基于任务23,添加节点的选择.增加与删除的功能 点击某个节点元素,则该节点元素呈现一个特殊被选中的样式 增加一个删除按钮,当选中某个节点元素后,点击删除按钮,则将该节点及其所有子节点删除掉 增加一个输入框及一个“添加”按钮当选中某个节点元素后,点击增加按钮,则在该节点下增加一个子节点,节点内容为输入框中内容,插入在其子节点的最后一个位置 1.解题过程 task24.html <!DOCTYPE html> <html> <head> <meta char

delphi TreeView 从数据库添加节点的四种方法

方法一:delphi中递归算法构建treeView 过程:通过读取数据库中table1的数据,来构建一颗树.table1有两个字段:ID,preID,即当前结点标志和父结点标志.所以整个树的表示为父母表示法.本递归算法不难写,但是要注意:程序内部的变量都应使用局部变量!比如当Query是外部变量(函数外定义或者直接通过控件拖拽得来)时就会得到错误的结果.代码如下: unit Unit1; interface uses  Windows, Messages, SysUtils, Variants,

js实现在末尾添加节点

在末尾添加节点: 1.获取ul标签 2.创建li标签 document.createElement("标签名称")方法 3.创建文本 document.createTextNode("文本内容"); 4.把文本添加到li下面 使用 appendChild方法 5.把添加到ul的末尾 使用 appendChild方法 <html> <head> <title>HTML示例</title> <style type=&

Oracle 11gR2 RAC 添加节点

1. 概述 生产,测试数据库添加节点. 2. 安装前准备 1.首先,物理链路的准备.这过程包括对db3进行存储映射.心跳互联等物理环境的准备: 2.根据db1.db2的操作系统配置,安装.配置db3的操作系统:注意此处需要配置的操作系统内容较多.大致包括确认RAC需要的系统安装包.系统核心参数配置.ASMLIB的配置./etc/hosts配置等等.详细可参考官方的安装指导手册. 3.根据db1.db2的操作系统组.用户的信息,在db3上创建相应的组.用户:创建对于的目录信息:注意:创建的组.用户

JS添加节点方法与JQuery添加节点方法的比较及总结

原生JS添加节点方法与JQuery添加节点方法的比较及总结 一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div1</div> <div id="div2">div2 <span id="span1">span1</span> <span id="span2">span2</span> <

16.2 添加节点和数据库

16.2  添加节点和数据库 16.2.1 添加节点 以上操作,脚本为: --- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE. :Connect SQLSVR3 USE [master] GO CREATE LOGIN [LOCALDOMAIN\SQLHAUser] FROM WINDOWS GO :Connect SQLSVR1 use [master] GO GRANT CONNECT ON ENDPOINT::[Hadr_end