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 相关文章推荐
DHTML Slide Show script图片轮换
Mar 03 Javascript
Js+Flash实现访问剪切板操作
Nov 20 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
JS中sort函数排序用法实例分析
Jun 16 Javascript
jQuery中animate的几种用法与注意事项
Dec 12 Javascript
javascript基本数据类型和转换
Mar 17 Javascript
JS实现可用滑块滑动的缓动图代码
Sep 01 Javascript
vue中实现动态生成二维码的方法
Feb 21 Javascript
JavaScript this指向相关原理及实例解析
Jul 10 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 SplObjectStorage使用实例
2015/05/12 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
js html实现计算器功能
2018/11/13 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Python与Redis的连接教程
2015/04/22 Python
Python图算法实例分析
2016/08/13 Python
python 使用get_argument获取url query参数
2017/04/28 Python
python3.4实现邮件发送功能
2018/05/28 Python
python多进程并发demo实例解析
2019/12/13 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
python实现从ftp服务器下载文件
2020/03/03 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
大学生专科学习生活的自我评价
2013/12/07 职场文书
城管综合整治方案
2014/05/01 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
环卫工人节活动总结
2014/08/29 职场文书
干部个人考察材料
2014/12/24 职场文书
销售助理岗位职责
2015/02/11 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
go goroutine 怎样进行错误处理
2021/07/16 Golang