自定义横向思维导图,横向组织架构图,横向树图。可以自定义节点颜色,样式,还可以导出为图片

news2024/11/18 21:46:43

最近公司设计要求根据目录结构,横向展示。所以做了一个横向的思维导图,横向的树结构,横向的组织架构图,可以自定义节点颜色,样式,还可以导出为图片

话不多说,直接上图片,这个就是一个小例子
在这里插入图片描述子组件,直接上代码,子组件的线条颜色,可以自己设置变量从父组件传入,我这里没写。
isUnfold 表示是否有下级

<template>
  <div class="my-self-tree" ref="my-tree">
    <div class="info-card">
      <div class="card-item" v-for="(item, index) in data" :key="index">
        <div
          class="vertical-line"
          :style="computedHeight(item.height, data.length, index)"
          v-if="item.level !== 0"
        ></div>
        <div class="horizontal-line" v-if="item.level !== 0"></div>
        <div class="tree-node" :class="{'tree-node-1': item.level == 0&&item.isUnfold != 0}">
          <div
            class="tree-node-content"
            :class="[handlItem(item)]"
            @click="clickTreeNode(item)"
          >
            {{ item.name }}
          </div>
        </div>
        <div
          class="horizontal-line"
          v-if="item.childNode && item.childNode.length !== 0"
        ></div>
        <mytree
          @nodeClick="clickTreeNode"
          :data="item.childNode"
          v-if="item.childNode && item.childNode.length !== 0"
        ></mytree>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "mytree",
  props: {
    data: Array,
  },
  data() {
    return {};
  },
  methods: {
    computedHeight(pheight, length, index) {
      if (length == 1 || length == 0) {
        return {
          height: "0px",
          display: "none",
        };
      } else {
        let height = 0;
        let marginTop = 0;
        let marginB = 0;
        if (index == 0) {
          height = pheight / 2;
          marginTop = height;
          return {
            height: height + "px",
            "margin-top": marginTop + "px",
          };
        }
        if (index == length - 1) {
          height = pheight / 2;
          marginB = height;
          return {
            height: height + "px",
            "margin-bottom": marginB + "px",
          };
        } else {
          height = pheight;
          return {
            height: height + "px",
          };
        }
      }
    },
    clickTreeNode(item) {
      this.$emit("nodeClick", item);
    },
    handlItem(item) {
      if (item.level == 0) {
        return 'has-background'
      }else {
        if (item.isUnfold == 1) {//中间节点
          let flag = this.hasZeroCountNode(item.childNode);
          console.log(flag, 'flag')
          if (item.level == 1) {
            return flag ? 'font-color-black border-black' : 'font-color-green border-green';
          } else {
            return flag ? 'font-color-black' : 'font-color-green';
          }
        } else if (item.isUnfold == 0) {//最后一个节点
          if (item.level == 1) {
            return item.count == 0 ? 'font-color-red border-red' : 'font-color-green border-green'
          } else {
            return item.count == 0 ? 'font-color-red' : 'font-color-green'
          }
        }
      }
    },
    hasZeroCountNode(nodes) {
      //不含当前节点的count判断,判断所有子节点
      for (let node of nodes) {
        if (node.count === 0) {
          return true;
        }
        if (node.childNode && this.hasZeroCountNode(node.childNode)) {
          return true;
        }
      }
      return false;
      //含当前节点的count判断
      // if (node.count === 0) {
      //   return true; // 如果找到节点的count为0,立即返回true
      // }
      // if (node.childNode && node.childNode.length > 0) {
      //   // 如果节点有子节点,则递归检查子节点
      //   return node.childNode.some(child => this.hasZeroCountNode(child));
      // }
      // return false; // 如果节点和其子节点都不满足条件,返回false
    }
  },
  components: {},
  mounted() {},
};
</script>

<style lang="scss" scoped>
:root .my-self-tree {
  // height: 100%;
  // width: 100%;
  .vertical-line {
    position: relative;
    // display: inline-block;
    width: 0.5px;
    background: #009694;
    transform:scale(2, 1);
  }
  .card-item {
    margin:0;padding:0;
    display: flex;
    align-items: center;
    .horizontal-line {
      min-width: 30px !important;
      //   display: inline-block;
      height: 0.5px;
      background: #009694;
      transform:scale(1 , 2);
      position: relative;
    }
    .horizontal-line::before {
      content:'';
      position:absolute;
      height: 1px;
      width:2px;
      right:-1px;
      background: #009694;
    }
    .horizontal-line::after {
      content:'';
      position:absolute;
      height: 1px;
      width:2px;
      left:-1px;
      background: #009694;
    }
  }
  .tree-node {
    cursor: pointer;
    height: 30px;
    position: relative;
    &:nth-child(1)::after {
      display: none;
    }
    // &:nth-child(1)::before {
    //   position: absolute;
    //   content: "";
    //   width: 8px;
    //   display: inline-block;
    //   height: 8px;
    //   border-radius: 4px;
    //   top: 50%;
    //   right: -4px;
    //   transform: translateY(-50%);
    //   background: #009694;
    // }
    .tree-node-content {
      display: flex;
      position: relative;
      justify-content: center;
      align-items: center;
      width: auto;
      height: 100%;
      border: none;
      border-radius: 4px;
      color: #000;
      white-space: nowrap !important;
      padding: 0 10px;
    }
    .has-background {
      color: white;
      background: #009694;
    }
    .border-green {
      border: 1px solid #009694;
    }
    .border-black {
      border: 1px solid #000;
    }
    .border-red {
      border: 1px solid #FF6767;
    }
    .font-color-green {
      color: #009694;
    }
    .font-color-black {
      color: #000;
    }
    .font-color-red {
      color: #FF6767;
    }
  }
  .tree-node::after {
    position: absolute;
    content: "";
    width: 8px;
    display: inline-block;
    height: 8px;
    border-radius: 4px;
    top: 50%;
    left: -4px;
    transform: translateY(-50%);
    background: #009694;
  }
  .tree-node-1::before {
      position: absolute;
      content: "";
      width: 8px;
      display: inline-block;
      height: 8px;
      border-radius: 4px;
      top: 50%;
      right: -4px;
      transform: translateY(-50%);
      background: #009694;
    }
}
</style>

这里是父组件

<el-popconfirm
          placement="top-end"
          title="是否需要导出为图片?"
          @confirm="exportFn"
          >
          <el-button
            slot="reference"
            style="margin-left: 10px"
            type="primary"
            class="fliter-btn icons-btn"
            size="mini"
            ><i class="qhFileManage icon-daochu" style="font-size: 14px;"></i> 导出
          </el-button>
          </el-popconfirm>
<tree :data="dataInfo" @nodeClick="nodeClick" id="mytree" style="height: 100%;"></tree>

//处理数据
//temporaryData 为实际获取的数据 ,temporaryData1 是做例子写的数据
    handleData(temporaryData) {
      //自行调试测试数据,后面换成正式数据
      let temporaryData1 = [
        {
          id: 1,
          level: 0,
          name: "部门名称啊",
          childNode: [
            {
              id: 11,
              level: 1,
              name: "自己测试数据",
              isUnfold: 1,
              childNode: [
                {
                  id: 1111111,
                  level: 2,
                  name: "所有下级节点count>0",
                  isUnfold: 1,
                  childNode: [
                    {
                      id: 1111111,
                      level: 3,
                      name: "2ge",
                      count: 2,
                      isUnfold: 0,
                    },
                    {
                      id: 1111111,
                      level: 3,
                      name: 1,
                      isUnfold: 1,
                      childNode: [
                        {
                          id: 1111111,
                          level: 4,
                          name: "2",
                          isUnfold: 1,
                          childNode: [
                            {
                              id: 1111111,
                              level: 4,
                              name: "1ge",
                              count: 1,
                              isUnfold: 0,
                            },
                          ],
                        },
                      ],
                    },
                    {
                      id: 1111111,
                      level: 3,
                      name: "2ge",
                      count: 2,
                      isUnfold: 0,
                    },
                  ],
                },
                {
                  id: 1111111,
                  level: 2,
                  name: "所有下级节点count=0",
                  isUnfold: 1,
                  childNode: [
                    {
                      id: 1111111,
                      level: 3,
                      name: "0ge",
                      count: 0,
                      isUnfold: 0,
                    },
                    {
                      id: 1111111,
                      level: 3,
                      name: 1,
                      isUnfold: 1,
                      childNode: [
                        {
                          id: 1111111,
                          level: 4,
                          name: "0ge",
                          count: 0,
                          isUnfold: 0,
                        },
                      ],
                    },
                    {
                      id: 1111111,
                      level: 3,
                      name: "0ge",
                      count: 0,
                      isUnfold: 0,
                    },
                  ],
                },
                {
                  id: 1111111,
                  level: 2,
                  name: "所有下级节点存count=0,>0",
                  isUnfold: 1,
                  childNode: [
                    {
                      id: 1111111,
                      level: 3,
                      name: "0ge",
                      count: 0,
                      isUnfold: 0,
                    },
                    {
                      id: 1111111,
                      level: 3,
                      name: 1,
                      isUnfold: 1,
                      childNode: [
                        {
                          id: 1111111,
                          level: 4,
                          name: "1ge",
                          count: 1,
                          isUnfold: 0,
                        },
                      ],
                    },
                    {
                      id: 1111111,
                      level: 3,
                      name: "1ge",
                      count: 1,
                      isUnfold: 0,
                    },
                  ],
                },
              ],
            },
          ],
          isUnfold: 1,
        },
      ];
      let fixedData = temporaryData.map((item) => {
        return this.traveTree(item);
      });
      console.log(fixedData, "fixedData");
      this.dataInfo = fixedData;
    },
// traveTree这里是给每个节点设置高度,
    traveTree(nodeInfo) {
      let childrenInfo = nodeInfo.childNode;
      if (!childrenInfo || childrenInfo.length == 0) {
        nodeInfo.height = 40;
      } else {
        childrenInfo.map((item) => {
          this.traveTree(item);
        });

        nodeInfo.height = childrenInfo.reduce((preV, n) => {
          return preV + n.height;
        }, 0);
      }
      return nodeInfo;
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django自定义命令

Django自定义命令 我们知道&#xff0c;Django内部内置了很多命令&#xff0c;例如 python manage.py runserver python manage.py makemigrations python manage.py migrate我们可以在python控制台中查看所有命令 我们也可以自定义命令&#xff0c;让python manage.py执行…

如何使用甘特图来做任务管理?zz-plan甘特图的实践指南

在项目管理和任务调度中&#xff0c;甘特图是一种非常实用的工具&#xff0c;它可以帮助团队成员清晰地规划、执行和跟踪项目进度。然而&#xff0c;如何有效利用甘特图进行任务管理&#xff0c;对于许多团队来说仍然是一个挑战。本文将结合 zz-plan https://zz-plan.com/ 甘特…

彻底搞懂JavaScript原型和原型链

基于原型编程 在面向对象的编程语言中&#xff0c;类和对象的关系是铸模和铸件的关系&#xff0c;对象总是从类创建而来&#xff0c;比如Java中&#xff0c;必须先创建类再基于类实例化对象。 而在基于原型编程的思想中&#xff0c;类并不是必须的&#xff0c;对象都是通过克隆…

Unity数据持久化2——XML

简介&#xff1a; 基础知识 XML文件格式 XML基本语法 XML属性 练习&#xff1a; C#读取存储XML XML文件存放位置 读取XML文件 练习&#xff1a; 存储修改XML文件 练习&#xff1a; 总结 实践小项目 必备知识点 必备知识点——C#中XML序列化 必备知识点——C#中XML反序列化 必备…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同&#xff0c;默认root开机不能登录。 1、输入一下命令创建root密码&#xff0c;根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件&#xff0c;将auth required pam_succeed_if.so user ! root quiet_success这行注释掉&#xff0c;这行就…

【python】python社交交友平台系统设计与实现(源码+数据库)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

python安装路径可以更改吗

Python3.5默认安装路径是当前用户的 AppData\.. 下 现在安装过程中默认是install just for me&#xff0c;这个会把python默认安装到AppData文件夹中&#xff0c;如果选了install for all users&#xff0c;就会默认安装到C盘根目录了。 python3.5 安装&#xff1a; 输入官网…

机器学习入门-sklearn

概述 机器学习定义是什么&#xff1f; 官方定义&#xff1a; 机器学习是人工智能核心&#xff0c;是使计算机具有智能的根本途径。&#xff08;地位&#xff09; 机器学习专门研究计算机怎样模拟或实现人类的学习行为&#xff08;研究内容&#xff09;&#xff0c;以获取新的…

PyCharm控制台中文乱码,输出�¹���

问题&#xff1a;很离谱的一件事就是python控制台可以正常的输出中文&#xff0c;但在pycharm控制台中就是乱码。 解决方法&#xff1a;之前看他们一些文章说设置pycharm的文件编码&#xff0c;不管怎么改都没用。 只是设置第一张图中的内容无效 好了&#xff0c;打完收工~

uview1.0 u-form表单回显校验不通过

提交到后端的数据&#xff0c;回显后不做任何修改无法通过表单校验 原因&#xff0c;u-form表单校验的类型默认为string&#xff0c;但是后端返回的是integer类型&#xff0c;导致无法通过校验 解决&#xff0c;既然后端返回的是整数形&#xff0c;那么我们就将校验规则的type…

有没有软件可以监控电脑软件?监控电脑软件的系统

有没有软件可以监控电脑软件&#xff1f;监控电脑软件的系统 电脑软件如果不合规也会给企业带来安全危害&#xff0c;比如盗版软件&#xff0c;比如游戏软件耽误工作等&#xff0c;所以需要对电脑软件的监控。下面我将详细介绍几款代表性的电脑监控软件及其功能&#xff0c;帮…

vscode添加代办相关插件,提高开发效率

这里写目录标题 前言插件添加添加TODO Highlight安装TODO Highlight在项目中自定义需要高亮显示的关键字 TODO Tree安装TODO Tree插件 单行注释快捷键 前言 在前端开发中&#xff0c;我们经常会遇到一些未完成、有问题或需要修复的部分&#xff0c;但又暂时未完成或未确定如何处…

树的非递归遍历(层序)

层序是采用队列的方式来遍历的 就比如说上面这颗树 他层序的就是&#xff1a;1 24 356 void LevelOrder(BTNode* root) {Que q;QueueInit(&q);if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){BTNode* front QueueFront(&q);QueuePop(&q);print…

Flutter Text导致A RenderFlex overflowed by xxx pixels on the right.

使用Row用来展示两个Text的时候页面出现如下异常,提示"A RenderFlex overflowed by xxx pixels on the right." The following assertion was thrown during layout: A RenderFlex overflowed by 4.8 pixels on the right.The relevant error-causing widget was:…

存储+调优:存储-Cloud

存储调优&#xff1a;存储-Cloud Master Server 配置&#xff1a; IP192.168.1.254 useradd mfs tar zxf mfs-1.6.11.tar.gz.gz cd mfs-1.6.11 ./configure --prefix/usr --sysconfdir/etc --localstatedir/var/lib --with-default-usermfs --with-default-groupmfs --disabl…

机器学习之决策树算法

使用决策树训练红酒数据集 完整代码&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn import tree, datasets from sklearn.model_selection import train_test_split# 准备数据&#xff0c;这里…

安装pip install xmind2image失败,4种安装pip install xmind2image在temunx高级终端的失败,却又意外发现

~ $ ~ $ ![在这里插入图片描述](https://img-blog.csdnimg.cn/b59cbb49c3e14a3bbec5675164a14009.png)#!/bin/bash # 创建一个新的空白XMind文件 xmind_dir ( m k t e m p − d ) x m i n d f i l e n a m e ′ t e s t . x m i n d ′ x m i n d p a t h " (mktemp -d…

github设置项目分类

https://www.php.cn/faq/541957.html https://docs.github.com/zh/repositories/working-with-files/managing-files/creating-new-files

在数据中心网络中隔离大象流

1000 条短突发中混入几条大象流将严重影响短突发 p99 latency&#xff0c;造成抖动。这个我在 隔离网络流以优化网络 论证过了&#xff0c;还有另一种更直观的理解方式&#xff1a; 规模差异越大&#xff0c;算术均值越偏离中位数&#xff0c;即算术均值的分位数越高。 可以…

web4.0-元宇宙虚拟现实

互联网一直在不断演变和改变我们的生活方式&#xff0c;从Web逐渐 1.0时代的静态网页到Web 2.0时代的社会性和内容制作&#xff0c;再从Web逐渐 在3.0阶段&#xff0c;互联网发展一直推动着大家时代的发展。如今&#xff0c;大家正站在互联网演化的新起点上&#xff0c;迈入Web…