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


Posted in Javascript onSeptember 30, 2017

本文介绍了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;

效果图:

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

DOM结构图

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

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

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

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

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

Javascript 相关文章推荐
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 Javascript
Jquery知识点二 jquery下对数组的操作
Jan 15 Javascript
jquery自定义类似$.ajax()的方法实现代码
Aug 13 Javascript
JavaScript定时器实现的原理分析
Dec 06 Javascript
基于vue2.0实现的级联选择器
Jun 09 Javascript
JS自定义滚动条效果简单实现代码
Oct 27 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 Javascript
JS实现元素上下左右移动效果
Oct 18 Javascript
微信小程序中添加客服按钮contact-button功能
Apr 27 Javascript
vue2.0 下拉框默认标题设置方法
Aug 22 Javascript
JS实现打砖块游戏
Feb 14 Javascript
js实现双人五子棋小游戏
May 28 Javascript
JS动态添加的div点击跳转到另一页面实现代码
Sep 30 #Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
Sep 30 #Javascript
jqgrid实现简单的单行编辑功能
Sep 30 #Javascript
微信小程序富文本渲染引擎的详解
Sep 30 #Javascript
js实现数组和对象的深浅拷贝
Sep 30 #Javascript
node通过express搭建自己的服务器
Sep 30 #Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 #Javascript
You might like
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
greybox——不开新窗口看新的网页
2007/02/20 Javascript
Javascript与flash交互通信基础教程
2008/08/07 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
Python反射的用法实例分析
2018/02/11 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
Python阶乘求和的代码详解
2020/02/14 Python
Django设置Postgresql的操作
2020/05/14 Python
python利用线程实现多任务
2020/09/18 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
2014年五一活动策划方案
2014/03/15 职场文书
工地安全质量标语
2014/06/07 职场文书
庆七一宣传标语
2014/10/08 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript