资讯专栏INFORMATION COLUMN

React实践之Tree组件

chanthuang / 3448人阅读

摘要:实践之组件实现功能渲染数据展开合并使用数据结构引用代码组件实现代码这是点击时调用的方法如果当前这个没有旋转,那就设置旋转,视觉效果点击的时候设置当前

React实践之Tree组件

实现功能

渲染数据

展开合并

使用

数据结构:

</>复制代码

  1. const node = {
  2. title: "00000",
  3. key: "0" ,
  4. level:"level1",
  5. open: true,
  6. child:[
  7. {
  8. title: "0-111111",
  9. key: "0-0",
  10. level:"level2",
  11. open: true,
  12. child:[
  13. {
  14. title: "0-1-1111",
  15. key: "0-0-0",
  16. level:"level3",
  17. },
  18. {
  19. title: "0-1-2222",
  20. key: "0-0-1",
  21. level:"level3",
  22. open: true,
  23. child: [
  24. {
  25. title: "0-1-2-11111",
  26. key: "0-0-1-0",
  27. level:"level4",
  28. open: true,
  29. child: [
  30. {
  31. title: "0-1-2-1-111",
  32. key: "0-0-1-0-0",
  33. level:"level5",
  34. }
  35. ]
  36. }
  37. ]
  38. },
  39. {
  40. title: "0-1-33333",
  41. key: "0-0-4",
  42. level:"level3",
  43. },
  44. ]
  45. },
  46. {
  47. title: "0-222222",
  48. key: "0-2",
  49. level:"level2",
  50. open: false,
  51. child: [
  52. {
  53. title: "0-2-1111",
  54. key: "0-2-0",
  55. level:"level3",
  56. },
  57. {
  58. title: "0-2-22222",
  59. key: "0-2-1",
  60. level:"level3",
  61. },
  62. {
  63. title: "0-2-33333",
  64. key: "0-2-2",
  65. level:"level3",
  66. }
  67. ]
  68. }
  69. ]
  70. }

引用代码:

</>复制代码

组件实现代码:

</>复制代码

  1. import React, { Component } from "react";
  2. import classNames from "classnames";
  3. const history = createHistory();
  4. import {
  5. BrowserRouter as Router,
  6. HashRouter,
  7. Route,
  8. Link,
  9. Switch,
  10. NavLink
  11. } from "react-router-dom";
  12. class Tree extends Component {
  13. constructor(props){
  14. super(props)
  15. this.treeItemCroup = this.treeItemCroup.bind(this);
  16. this.handleClick = this.handleClick.bind(this);
  17. this.state ={
  18. openList : false
  19. }
  20. }
  21. handleClick(e) {
  22. // 这是点击➡️ 时调用的方法
  23. // 如果当前这个➡️ 没有旋转,那就设置旋转,视觉效果
  24. e.target.style.transform = e.target.style.transform == "rotate(-90deg)" ? "rotate(0deg)" : "rotate(-90deg)"
  25. for(let item in e.target.parentNode.parentNode.childNodes){
  26. // 点击的时候设置当前层级的子元素素隐藏
  27. // 操作了DOM,我很难受
  28. if(item > 0){
  29. e.target.parentNode.parentNode.childNodes[item].style.display = e.target.parentNode.parentNode.childNodes[item].style.display === "none" ? "block" : "none"
  30. }
  31. }
  32. }
  33. itemTitle(item){
  34. // 这个是返回title,因为有时候是点击一个链接,所以设置了两种情况,如果node节点里面有component这个节点,那就设置成可以点击跳转
  35. if(item.component){
  36. return (
  37. {item.title}
  38. )
  39. }else{
  40. return (
  41. {item.title}
  42. )
  43. }
  44. }
  45. treeItemCroup(itemGroup) {
  46. let itemGroupItem = []
  47. // 每个元素的样式,根据当前等级来设置样式,level1的就缩紧20px,level2的缩紧40px,一次类推,在视觉上呈现树的形式
  48. let itemStyle = {
  49. paddingLeft: 20*parseInt(itemGroup.level.slice(5), 10)+"px"
  50. }
  51. // 如果当前节点还有子元素,就设置一个➡️ 箭头 ,可以点击展开。
  52. let iconChevron = classNames("fa",{"fa-chevron-down" : itemGroup.child})
  53. // 把所有节点放在一个数组里面
  54. itemGroupItem.push(
    • {/* 第一个层级 */}
    • {this.itemTitle(itemGroup)}
    • {/* 调用tree方法 */}
    • {this.tree(itemGroup.child)}
  55. )
  56. return itemGroupItem
  57. }
  58. tree(child){
  59. let treeItem
  60. // 如果有子元素
  61. if(child){
  62. // 子元素是数组的形式,把所有的子元素循环出来
  63. treeItem = child.map((item, key) => {
  64. // 同理,设置样式
  65. let itemStyle = {
  66. paddingLeft: 20*parseInt(item.level.slice(5), 10)+"px"
  67. }
  68. // 同理,设置➡️
  69. let iconChevron = classNames("fa",{"fa-chevron-down" : item.child})
  70. return (
    • {this.itemTitle(item)}
    • {/* 如果当前子元素还有子元素,就递归使用tree方法,把当前子元素的子元素渲染出来 */}
    • {this.tree(item.child)}
  71. )
  72. })
  73. }
  74. return treeItem
  75. }
  76. render() {
  77. return (
  78. { this.treeItemCroup(this.props.treeList) }
  79. );
  80. }
  81. }
  82. export default Tree;

效果图:

DOM结构图


代码我加了一些注释,可能还是比较难理清楚逻辑 ?
当前的逻辑我觉得有点混乱,希望看的朋友们能给出一点建议,感激不尽

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88813.html

相关文章

  • 少妇白洁系列React StateUp Pattern, Explained

    摘要:本文用于阐述模式的算法和数学背景,以及解释了它为什么是里最完美的状态管理实现。欢迎大家讨论和发表意见。 本文用于阐述StateUp模式的算法和数学背景,以及解释了它为什么是React里最完美的状态管理实现。 关于StateUp模式请参阅:https://segmentfault.com/a/11... P-State, V-State 如果要做组件的态封装,从组件内部看,存在两种不同的...

    20171112 评论0 收藏0
  • 前端每周清单第 50 期: AngularJS and Long Term Support, Web

    摘要:在该版本发布之后,开发团队并不会继续发布新的特性,而会着眼于进行重大的错误修复。发布每六个星期,团队就会创建新的分支作为发布通道,本文即是对新近发布的版本进行简要介绍。 showImg(https://segmentfault.com/img/remote/1460000013229009); 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热...

    DobbyKim 评论0 收藏0
  • webpack 基础与项目优化实践总结

    摘要:前言本文基于,主要涉及基本概念基本配置和实际项目打包优化。关于概念方面参考官网,常用配置来自于网络资源,在文末有相关参考链接,实践部分基于自己的项目进行优化配置。同一文件中,修改某个影响其他。 前言:本文基于weboack4.x,主要涉及webpack4 基本概念、基本配置和实际项目打包优化。关于概念方面参考官网,常用配置来自于网络资源,在文末有相关参考链接,实践部分基于自己的项目进行...

    Scorpion 评论0 收藏0
  • 我为什么从Redux迁移到了Mobx

    摘要:需要注意的是,在中,需要把数据声明为。同时还提供了运行时的类型安全检查。在利用了,使异步操作可以在一个函数内完成并且可以被追踪。例如在中,数组并不是一个,而是一个类的对象,这是为了能监听到数据下标的赋值。 Redux是一个数据管理层,被广泛用于管理复杂应用的数据。但是实际使用中,Redux的表现差强人意,可以说是不好用。而同时,社区也出现了一些数据管理的方案,Mobx就是其中之一。 R...

    DevYK 评论0 收藏0
  • 漫谈前端性能 突破 React 应用瓶颈

    摘要:表示调用栈在下一将要执行的任务。两方性能解药我们一般有两种方案突破上文提到的瓶颈将耗时高成本高易阻塞的长任务切片,分成子任务,并异步执行这样一来,这些子任务会在不同的周期执行,进而主线程就可以在子任务间隙当中执行更新操作。 showImg(https://segmentfault.com/img/remote/1460000016008111); 性能一直以来是前端开发中非常重要的话题...

    whlong 评论0 收藏0

发表评论

0条评论

chanthuang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<