全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

React实践之Tree组件的使用方法

本文介绍了React实践之Tree组件,分享给大家,具体如下:

实现功能

  • 渲染数据
  • 展开合并

使用

数据结构:

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

引用代码:

<div>
  <Tree 
    treeList = {node}
  /> 
</div>

组件实现代码:

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) {
    // 这是点击➡️ 时调用的方法
    // 如果当前这个➡️ 没有旋转,那就设置旋转,视觉效果
    e.target.style.transform = e.target.style.transform == "rotate(-90deg)" ? "rotate(0deg)" : "rotate(-90deg)"
    for(let item in e.target.parentNode.parentNode.childNodes){
      // 点击的时候设置当前层级的子元素素隐藏
      // 操作了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){
    // 这个是返回title,因为有时候是点击一个链接,所以设置了两种情况,如果node节点里面有component这个节点,那就设置成可以点击跳转
    if(item.component){ 
      return (<Link to={ item.component } >
             <span onClick={this.handleClick.bind(this)}>{item.title}</span>
          </Link>)
    }else{
      return (
         <span onClick={this.handleClick.bind(this)}>{item.title}</span>
      )
    }
  }

  treeItemCroup(itemGroup) {
    let itemGroupItem = []
    // 每个元素的样式,根据当前等级来设置样式,level1的就缩紧20px,level2的缩紧40px,一次类推,在视觉上呈现树的形式
    let itemStyle = {
        paddingLeft: 20*parseInt(itemGroup.level.slice(5), 10)+'px'
      }
    // 如果当前节点还有子元素,就设置一个➡️ 箭头 ,可以点击展开。
    let iconChevron = classNames('fa',{'fa-chevron-down' : itemGroup.child})
    // 把所有节点放在一个数组里面
    itemGroupItem.push(
      <ul>
        {/* 第一个层级 */}
        <li className={itemGroup.level} key={itemGroup.key} style={itemStyle}>
          <i aria-hidden="true" className={iconChevron} onClick={this.handleClick.bind(this)}></i>
          {this.itemTitle(itemGroup)}
        </li>
        {/* 调用tree方法 */}
        {this.tree(itemGroup.child)}
      </ul>
    )
    return itemGroupItem
  }

  tree(child){
    let treeItem
    // 如果有子元素
    if(child){ 
      // 子元素是数组的形式,把所有的子元素循环出来
      treeItem = child.map((item, key) => {
        // 同理,设置样式
        let itemStyle = {
          paddingLeft: 20*parseInt(item.level.slice(5), 10)+'px'
        }
        // 同理,设置➡️ 
        let iconChevron = classNames('fa',{'fa-chevron-down' : item.child})
        return (
          <ul>
            <li className={item.level} key={key} style={itemStyle}>
              <i aria-hidden="true" className={iconChevron} onClick={this.handleClick.bind(this)}></i>
              {this.itemTitle(item)}
            </li>
            {/* 如果当前子元素还有子元素,就递归使用tree方法,把当前子元素的子元素渲染出来 */}
            {this.tree(item.child)}
          </ul>
        )
      })
    }
    return treeItem
  }

  render() {
    return (
      <div className="tree">
        { this.treeItemCroup(this.props.treeList) }
      </div>
    );
  }
}

export default Tree;

效果图:

DOM结构图

代码我加了一些注释,可能还是比较难理清楚逻辑 😫

当前的逻辑我觉得有点混乱,希望看的朋友们能给出一点建议,感激不尽

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# React  # Tree组件  # Tree  # 深入理解React中es6创建组件this的方法  # 使用React实现轮播效果组件示例代码  # React组件的三种写法总结  # React创建组件的三种方式及其区别  # React 子组件向父组件传值的方法  # 详解React开发中使用require.ensure()按需加载ES6组件  # 详解react如何在组件中获取路由参数  # Reactjs实现通用分页组件的实例代码  # 那就  # 递归  # 这是  # 放在  # 我觉得  # 第一个  # 结构图  # 两种  # 我很  # 感激不尽  # 数据结构  # 朋友们  # 作了  # 给大家  # 跳转  # 大家多多  # 设置成  # 较难  # 素素  # Link 


相关文章: 如何在万网开始建站?分步指南解析  营销式网站制作方案,销售哪个网站招聘效果最好?  ,sp开头的版面叫什么?  建站之星安装后如何自定义网站颜色与字体?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  建站中国官网:模板定制+SEO优化+建站流程一站式指南  如何在Golang中使用replace替换模块_指定本地或远程路径  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站之星各版本价格是多少?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  建站之星如何优化SEO以实现高效排名?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何在香港免费服务器上快速搭建网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  太平洋网站制作公司,网络用语太平洋是什么意思?  如何在阿里云通过域名搭建网站?  建站主机如何选?性能与价格怎样平衡?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  建站之星后台管理如何实现高效配置?  如何高效配置香港服务器实现快速建站?  金*站制作公司有哪些,金华教育集团官网?  建站之星如何配置系统实现高效建站?  黑客如何利用漏洞与弱口令入侵网站服务器?  网站图片在线制作软件,怎么在图片上做链接?  潮流网站制作头像软件下载,适合母子的网名有哪些?  建站之星北京办公室:智能建站系统与小程序生成方案解析  长沙企业网站制作哪家好,长沙水业集团官方网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Thinkphp 中 distinct 的用法解析  建站之星IIS配置教程:代码生成技巧与站点搭建指南  建站之星×万网:智能建站系统+自助建站平台一键生成  如何在阿里云购买域名并搭建网站?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  ,如何利用word制作宣传手册?  如何用虚拟主机快速搭建网站?详细步骤解析  如何通过FTP空间快速搭建安全高效网站?  实例解析angularjs的filter过滤器  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  北京网站制作网页,网站升级改版需要多久?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  建站之星如何快速更换网站模板?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  详解jQuery停止动画——stop()方法的使用  如何快速生成凡客建站的专业级图册? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。