Vue3 组合式实现 带连接线的Tree型 架构图(一级树形图)

news2024/9/30 19:39:11

在这里插入图片描述
创建组件名称 TreeNodeView.vue

<template>
  <div class="tree-node">
    <div class="node">{{ rootNodeName }}</div>
    <div class="children" :style="childrenLineStyle">
      <div class="child-node" v-for="node in childNodes" :key="node.id">
        <div class="node">{{ node.name }}</div>
      </div>
    </div>
  </div>
</template>

<script setup>
import {computed, ref, onMounted} from 'vue';

const props = defineProps({
  childNodes: {
    type: Array,
    required: true
  },
  rootNodeName: {
    type: String,
    required: true,
  },
});


const childNode = ref(null);
const childrenWidth = ref(null);
const childrenMarginLeft = ref(null);

const childrenLineStyle = computed(() => {
  if (!childNode.value) {
    return {};
  }

  const getWidth = (element) => {
    const style = getComputedStyle(element);
    return parseFloat(style.width) + parseFloat(style.marginLeft) + parseFloat(style.marginRight);
  };

  let allNodeWidth = Array.from(childNode.value).reduce((total, node) => total + getWidth(node), 0);
  const firstNodeWidth = getWidth(childNode.value[0]) / 2;
  let lastNodeWidth = 0;
  if (childNode.value.length > 1) {
    lastNodeWidth = getWidth(childNode.value[childNode.value.length - 1]) / 2;
  }
  childrenWidth.value = `${allNodeWidth - firstNodeWidth - lastNodeWidth}px`;
  childrenMarginLeft.value = `${firstNodeWidth}px`;
  return {};
});

onMounted(() => {
  childNode.value = document.querySelectorAll('.child-node');
});
</script>

<style>
.tree-node {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
}

.node {
  border: 1px solid #000;
  padding: 5px;
  position: relative;
}

.children {
  display: flex;
  justify-content: center;
  position: relative;
  margin-top: 45px;
}

.children::before {
  content: '';
  height: 25px;
  border: 0.00001rem solid #000;
  position: absolute;
  top: -46px;
}

.child-node {
  position: relative;
  margin-left: 10px;
  margin-right: 10px;
}

.child-node::before {
  content: '';
  position: absolute;
  top: -20px;
  left: 50%;
  transform: translateX(-50%);
  height: 20px;
  border-left: 1px solid #000;
}

.children::after {
  content: '';
  position: absolute;
  top: -20px;
  left: 0;
  right: 0;
  border-top: 1px solid #000;
  width: v-bind(childrenWidth);
  margin-left: v-bind(childrenMarginLeft);
}
</style>

<template>
  <div class="tree-node">
    <TreeNodeView v-bind="nodeViewConfig"></TreeNodeView>
  </div>
</template>

<script setup>
import TreeNodeView from "./components/TreeNodeView.vue";

const nodeViewConfig = {
  rootNodeName: '根节点',
  childNodes: [
    {id: 1, name: '节点1-1'},
    {id: 2, name: '节点222222221-2'},
    {id: 3, name: '节点1-3'},
    {id: 4, name: '节点1-4222222'},
    {id: 5, name: '节点1-4'},
    {id: 6, name: '节点1-4'}
  ]
}
</script>

<style scoped>

</style>

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

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

相关文章

练习十一:简单卷积器的设计

简单卷积器的设计 1&#xff0c;任务目的&#xff1a;2&#xff0c;明确设计任务2.1,目前这部分代码两个文件没找到&#xff0c;见第5、6节&#xff0c;待解决中。 &#xff0c;卷积器的设计&#xff0c;RTL&#xff1a;con1.v4&#xff0c;前仿真和后仿真&#xff0c;测试信号…

一键自动修改和翻新OC源码,解决苹果审核4.3和马甲问题

ipaguard 自动修改/翻新/混淆/OC/iOS代码&#xff0c;自动替换类名&#xff0c;方法名 由来 网上有很多关于如何混淆iOS源码的方法&#xff0c;但是都不够智能&#xff0c;生成的方法类名要么千奇百怪&#xff0c;要么aaaabbbxxx这种完全毫无意义的名称&#xff0c;要么只能…

全网最新最全的自动化测试:python+pytest接口自动化-接口测试基础

接口定义 一般我们所说的接口即API&#xff0c;那什么又是API呢&#xff0c;百度给的定义如下&#xff1a; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c…

TEMU跨境平台与亚马逊检测认证几大认证您知道多少?

TEMU跨境平台与亚马逊检测认证几大认证您知道多少&#xff1f; TEMU跨境平台与亚马逊对于做外贸的人应该都不陌生,可是你是否知道产品入驻TEMU跨境平台与亚马逊需要办理的13大认证呢?如果你不知道,请认真阅读正面的内容,因为它关系着你的产品能否在TEMU跨境平台与亚马逊顺利上…

零基础学编程,中文编程工具构件之弹出菜单构件教程,中文编程工具下载

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础…

二进制动态插桩工具intel PIN的学习笔记

前言 最近两周为了课程汇报学习了intel PIN这个动态插桩&#xff08;dynamic instrument&#xff09;工具&#xff0c;总体的学习感受还是挺累的。一方面&#xff0c;这个方向比较小众&#xff0c;相关的二手资料比较少&#xff0c;能参考的也就只有官方手册这种一手资料&…

12.4c++中的继承

#include <iostream>using namespace std;class Sofa { private:string way;int *score; public:Sofa(){}//有参构造函数Sofa(string way,int score):way(way),score(new int(score)){cout << "Sofa::有参构造函数" << endl;}//拷贝构造函数Sofa(c…

从声纹模型到语音合成:音频处理 AI 技术前沿 | 开源专题 No.45

facebookresearch/audiocraft Stars: 16.6k License: MIT AudioCraft 是一个用于音频生成的 PyTorch 库。它包含了两个最先进的 AI 生成模型 (AudioGen 和 MusicGen) 的推理和训练代码&#xff0c;可以产生高质量音频。该项目还提供了其他功能&#xff1a; MusicGen&#xf…

12月4日作业

完成沙发床的多继承 #include <iostream>using namespace std;class Bed { private:string sleeping; public:double *price; public:Bed(){cout << "Bed::无参构造函数" << endl;}Bed(string sleeping,int price):sleeping(sleeping),price(new …

前缀和例题:子矩阵的和AcWing796-Java版

//前缀和模板提,在读入数据的时候就可以先算好前缀和的大小 //计算前缀的时候用:g[i][j] g[i][j-1] g[i-1][j] - g[i-1][j-1] Integer.parseInt(init[j-1]); //计算结果的时候用:g[x2][y2] - g[x1 - 1][y2]- g[x2][y1-1] g[x1 -1][y1 - 1] "\n" //一些重复加的地…

SAP系统邮件功能配置 SCOT <转载>

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/71594578 相信SAP顾问或多或少都会接到用户要求SAP系统能够定时发送邮件的功能&#xff0c;定时将用户需要的信息已邮件的方式发送给固定的人员。 下面就来讲一下SAP发送邮件应该如何配置&#xff1a; 1、RZ10做配置&#…

掌握排序的艺术:Python中sorted()函数全面解析!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 1. 引言 排序在编程中是一个基本且重要的操作&#xff0c;而 Python 中的 sorted() 函数则为我们提供了强大的排序能力。在本篇文章中&#xff0c;我们将深入研究不同排序算法、sorted() 函数的灵活性&#xff…

基于腾讯云手把手教你搭建网站

目录 前言前期准备工作具体搭建网站番外篇&#xff1a;网站开发及优化结束语 前言 在当今数字化时代浪潮之下&#xff0c;作为开发者拥有一个属于自己的网站是非常有必要的&#xff0c;也是展示个人形象、打造影响力和给别人提供服务的重要途径。网站不仅可以作为打造自己影响…

Rpg游戏地形生成

rpg游戏中的地形一般使用高度图的形式来绘制。写了几个随机生成高度图的算法。 最常见的是基于分形算法生成高度图&#xff0c;网上有很多资料&#xff0c;这里不再介绍。 一种生成断层效果高度图的算法 //!生成断层效果的高度图 void TerrainData::FillFaultSurface(float …

12.4作业

#include <iostream>using namespace std;class Sofa { private:string sit;int *nub; public:Sofa(){cout << "Sofa::无参构造函数" << endl;}Sofa(string sit,int nub):sit(sit),nub(new int(nub)){cout << "Sofa::有参构造函数"…

【刷题日志】牛客 HJ73 计算日期到天数转换

计算日期到天数转换 阅读题目解题方案 及 解题思路方法一 . 手撕日期类方法二 . 分别直接算出平年和闰年每个月的时间 并对应下标存入数组中&#xff0c;判断该年份为平年还是闰年&#xff0c;再 for循环依次求和优化&#xff1a;也不用分别算出平年和闰年的每个月的时间&#…

IntelliJ IDEA设置中文界面

1.下载中文插件 2. 点击重启IDE 3.问题就解决啦&#xff01;

目标检测中的损失函数:IOU_Loss、GIOU_Loss、DIOU_Loss和CIOU_Loss

文章目录 前言1.IOU_Loss&#xff08;Intersection over Union Loss&#xff09;2.GIOU_Loss&#xff08;Generalized Intersection over Union Loss&#xff09;3.DIOU_Loss&#xff08;Distance Intersection over Union Loss&#xff09;4.CIOU_Loss&#xff08;Complete In…

2023年5月电子学会青少年软件编程 Python编程等级考试一级真题解析(选择题)

2023年5月Python编程等级考试一级真题解析 选择题(共25题,每题2分,共50分) 1、可以对Python代码进行多行注释的是 A、# B、“ ” C、‘’‘ ’‘’ D、‘ ’ 答案:C 考点分析:考查python中注释,python中注释分为单行注释和多行注释,单行注释使用井号(#),多…

表达式二叉树的中序遍历:2017年408算法题

算法思想 表达式二叉树的中序遍历即中缀表达式除了根节点和叶结点&#xff0c;遍历到其他结点时在遍历其左子树前加上左括号&#xff0c;在遍历完右子树后加上右括号 算法实现 //中序遍历&#xff0c;deep从1开始&#xff0c;即根节点的深度为1 void midOrder(BTree T,int …