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 相关文章推荐
Javascript 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
jquery 圆形旋转图片滚动切换效果
Jan 19 Javascript
js用拖动滑块来控制图片大小的方法
Feb 27 Javascript
Node.js 学习笔记之简介、安装及配置
Mar 03 Javascript
购物车前端开发(jQuery和bootstrap3)
Aug 27 Javascript
Bootstrap页面缩小变形的快速解决办法
Feb 03 Javascript
JavaScript纯色二维码变成彩色二维码
Jul 23 Javascript
JS模拟实现哈希表及应用详解
May 04 Javascript
对vuex中getters计算过滤操作详解
Nov 06 Javascript
微信小程序表单验证WxValidate的使用
Nov 27 Javascript
Node.js API详解之 string_decoder用法实例分析
Apr 29 Javascript
详解Node.js使用token进行认证的简单示例
May 25 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 第二节 数据类型之数值型
2012/04/28 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
在UpdatePanel内jquery easyui效果失效的解决方法
2010/04/11 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
python多任务及返回值的处理方法
2019/01/22 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
一道Delphi上机题
2012/06/04 面试题
车工岗位职责
2013/11/26 职场文书
根叔历年演讲稿
2014/05/20 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
劳资员岗位职责
2015/02/13 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
创业计划书之家政服务
2019/09/18 职场文书