指引型树型组件的封装

最近,由于业务的需要,需要做一个指向形树型组件。在寻找各种文章后,终于有了思路。🤒🤒🤒

树型组件的思路主要是递归。谈到递归,我们首先要有递归的出口。递归的出口就是没有孩子节点了。这个时候,我们就是叶子节点。

实现效果图:
在这里插入图片描述

1.dom结构

树型组件肯定由两部分构成,一部分是节点本身,另一部分为孩子节点。

<div v-for="(item, index) in data" :key="index" class="grandFather_item"><!-- 父类 --><div class="father" :class="{'isRoot':deep===1}" @click="handleExplain(index)" style="line-height: 30px;height: 30px;">{{ item.title }}</div><!-- 如果有子类,那么将子类传过去 --><div class="children" v-if="item.children && item.children.length !== 0" v-show="item.isExplain"><Tree :data="item.children" :deep="deep + 1"></Tree></div></div>

这样,基本的显示就能够出来了。

2.缩进问题

因为我们每往下一级,我们就得往右边缩进一段距离。因此,我们的孩子肯定要包括在上一层的某个节点当中。因此需要给上述代码再包裹一层DOM结构。(在设置padding-left的时候内边距是累加的)。

 <div class="grandFather" :class="{ 'isRoot': deep === 1 }"><div v-for="(item, index) in data" :key="index" class="grandFather_item"><!-- 父类 --><div class="father" :class="{'isRoot':deep===1}" @click="handleExplain(index)" style="line-height: 30px;height: 30px;">{{ item.title }}</div><!-- 如果有子类,那么将子类传过去 --><div class="children" v-if="item.children && item.children.length !== 0" v-show="item.isExplain"><Tree :data="item.children" :deep="deep + 1"></Tree></div></div></div>

3.指引线

这里,我采用的思路是结合一个dom元素和一个伪元素进行布局。

dom元素主要是进行竖线(根据每一个类的高来布局)。伪元素进行横线(自己设)。然后计算边距。

<div class="grandFather" :class="{ 'isRoot': deep === 1 }"><div v-for="(item, index) in data" :key="index" class="grandFather_item"><div class="line"></div><!-- 父类 --><div class="father" :class="{'isRoot':deep===1}" @click="handleExplain(index)" style="line-height: 30px;height: 30px;">{{ item.title }}</div><!-- 如果有子类,那么将子类传过去 --><div class="children" v-if="item.children && item.children.length !== 0" v-show="item.isExplain"><Tree :data="item.children" :deep="deep + 1"></Tree></div></div></div>

如果要设置点状,等形状,可以采用边框的形式来做。

最后代码如下

Tree.vue

<template><div class="grandFather" :class="{ 'isRoot': deep === 1 }"><div v-for="(item, index) in data" :key="index" class="grandFather_item"><div class="line"></div><!-- 父类 --><div class="father" :class="{'isRoot':deep===1}" @click="handleExplain(index)" style="line-height: 30px;height: 30px;">{{ item.title }}</div><!-- 如果有子类,那么将子类传过去 --><div class="children" v-if="item.children && item.children.length !== 0" v-show="item.isExplain"><Tree :data="item.children" :deep="deep + 1"></Tree></div></div></div>
</template>
<script setup >
// import Tree from './Tree.vue'
import { onMounted, ref } from 'vue'
const props = defineProps(['data', 'deep']); // deep是用来监听深度的.
const acceptData = ref([])
onMounted(() => {acceptData.value = props.datafor (let item of acceptData.value) {if (item['isExplain'] === 'undefined') {item['isExplain'] = false; // 默认是不展开的}}console.log('acceptData.value', acceptData.value);})
const handleExplain = (index) => {console.log('index', index);console.log(acceptData.value[index])acceptData.value[index]['isExplain'] = !acceptData.value[index]['isExplain']
}
</script>
<style lang='scss' scoped>
.grandFather {height: 100%;padding-left: 20px;.grandFather_item {height: 100%;position: relative;.line {width: 0px;border-right:1px dotted  black;height: calc(100% - 45px);position: absolute;left: 2px;top: 30px;}.father {position: relative;cursor: pointer;}.father::before {position: absolute;left: -18px;top: 15px;content: '';display: block;width: 16px;height: 0px;border-top: 1px dotted black;// background-color: black;}.isRoot::before {display: none;}}position: relative;.line {height: 100%;width: 1px;position: absolute;}
}</style>

App.vue调用组件

<script setup>
import Tree from './components/Tree.vue';
import { ref } from 'vue';
const data = ref([{title: 'parent 1',key: '0-0',children: [{title: 'parent 1-0',key: '0-0-0',children: [{ title: 'leaf', key: '0-0-0-0' },{key: '0-0-0-1',title:'叶子啊'},{ title: 'leaf', key: '0-0-0-2' },],},{title: 'parent 1-1',key: '0-0-1',children: [{ title: 'leaf', key: '0-0-1-0' }],},{title: 'parent 1-2',key: '0-0-2',children: [{ title: 'leaf 1', key: '0-0-2-0' },{title: 'leaf 2',key: '0-0-2-1',},],},],
},
{title: 'parent 2',key: '0-1',children: [{title: 'parent 2-0',key: '0-1-0',children: [{ title: 'leaf', key: '0-1-0-0' },{ title: 'leaf', key: '0-1-0-1' },],},],
},
])
</script><template><div><Tree :data="data" :deep="1"></Tree></div>
</template><style scoped>
.logo {height: 6em;padding: 1.5em;will-change: filter;transition: filter 300ms;
}.logo:hover {filter: drop-shadow(0 0 2em #646cffaa);
}.logo.vue:hover {filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

最后大家如果有更好的想法,欢迎在评论区留言!🤓🤓🤓

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32主板-MoonESP32

产品简介 Moon-ESP32主板&#xff0c;一款以双核芯片ESP32-E为主芯片的主控板&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;低功耗&#xff0c;板载LED指示灯&#xff0c;引出所有IO端口&#xff0c;并提供多个I2C端口、SPI端口、串行端口&#xff0c;方便连接&#xff0c;…

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布&#xff0c;后来成为了一个独立的开源项目&#xff0c;并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据&#xff0c;并提供强大的查询语言PromQL来…

【C++基础】观察者模式(“发布-订阅”模式)

本文参考&#xff1a;观察者模式 - 摩根斯 | 爱编程的大丙 观察者模式允许我们定义一种订阅机制&#xff0c;可在对象事件发生时通知所有的观察者对象&#xff0c;使它们能够自动更新。观察者模式还有另外一个名字叫做“发布-订阅”模式。 发布者&#xff1a; 添加订阅者&…

K8s上安装gitlab-ce

文章目录 K8s上安装gitlab-ce操作如下gitlab-deployment.yml K8s上安装gitlab-ce 前言   使用pv-pvc来持久化gitlab的数据&#xff0c;配置&#xff0c;日志文件。   pod启动后需要需要修改external_url然后重启pod。 操作如下 mkdir -p /mnt/data01/gitlab ctr -n k8s.…

自动驾驶多任务框架Hybridnets——同时处理车辆检测、可驾驶区域分割、车道线分割模型部署(C++/Python)

一、多感知任务 在移动机器人的感知系统&#xff0c;包括自动驾驶汽车和无人机&#xff0c;会使用多种传感器来获取关键信息&#xff0c;从而实现对环境的感知和物体检测。这些传感器包括相机、激光雷达、雷达、惯性测量单元&#xff08;IMU&#xff09;、全球导航卫星系统&am…

PSP - 蛋白质序列提取 Transformer 蛋白质语言模型 ESM2 特征

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132888139 蛋白质语言模型 ESM (Evolutionary Scale Modeling) 是一种利用深度学习技术来预测蛋白质结构和功能的方法。ESM 通过在大规模的蛋白质…

【毕设选题】 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

​Qt for Python 入门¶​

本页重点介绍如何从源代码构建Qt for Python&#xff0c;如果你只想安装PySide2。 与你需要运行&#xff1a;pip pip install pyside2有关更多详细信息&#xff0c;请参阅我们的快速入门指南。此外&#xff0c;您可以 查看与项目相关的常见问题解答。 一般要求 Python&#xf…

华为云使用脚本初始化Linux数据盘

初始化新挂载的磁盘 登录云服务器&#xff0c;执行以下命令获取自动初始化磁盘脚本。 wget https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/datadisk/LinuxVMDataDiskAutoInitialize.sh 说明&#xff1a; 若回显异常&#xff0c;请检查云服务器是否绑定弹性公…

深度学习-全连接神经网络-训练过程-模型正则与超参数调优- [北邮鲁鹏]

目录标题 神经网络中的超参数学习率超参数优化方法网格搜索法随机搜索法 超参数搜索策略粗搜索精搜索 超参数的标尺空间 神经网络中的超参数 超参数 网络结构&#xff1a;隐层神经元个数&#xff0c;网络层数&#xff0c;非线性单元选择等优化相关&#xff1a;学习率、dorpou…

EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565

使用工具&#xff1a;WPS 举例&#xff1a; EXCEL如何把一个单元格内的文本和数字批量分开&#xff1f;不使用数据分列。 第一步、将第二行数据冻结 第二步、在B1、C1单元格输入需要分开的示例 第三步、点击选中B1单元格&#xff0c;输入快捷键【CTRLE】进行填充。B2单元格也是…

C++ - map 和 set 使用介绍

简介 其实在map 和 set 的底层实现当中有差不多一半的 结构是使用 二叉搜索树来实现&#xff0c;关于二叉搜索树可以看下面这个篇博客&#xff1a;C - 搜索二叉树_chihiro1122的博客-CSDN博客 而 set 是 key 模型&#xff0c;他是直接按照 key 值大小来有规律的在 二叉搜索树当…

pytorch环境配置

pytorch安装与基础 pytorch相关配置一&#xff1a;安装cuda1:找到nvidia control panel2:打开控制面板&#xff0c;找到系统信息中的&#xff0c;组件即可查看到cuda版本&#xff0c;这里我的cuda版本为12.0.1503&#xff1a;下载对应版本的 cuda toolkit4:安装流程5.验证是否安…

163邮箱开通发件功能

点击设置 查看详情 开启这个功能&#xff0c;如下 开通IMAP/SMTP服务 开通POP3/SMTP服务完成了 设置邮箱完成。

解决Agora声网音视频在后台没有声音的问题

前言:本文会介绍 Android 与 iOS 两个平台的处理方式 一、Android高版本在应用退到后台时,系统为了省电会限制应用的后台活动,因此我们需要开启一个前台服务,在前台服务中发送常驻任务栏通知,以此来保证App 退到后台时不会被限制活动. 前台服务代码如下: package com.notify…

QCustomPlot绘图类详解(大白话)

本文假定你会使用Qt开发&#xff0c;但未接触过QCustomPlot绘图类或者是刚接触。 如何往Qt中引入QCustomPlot 首先&#xff0c;去官网下载最新版本的源码&#xff0c;注意是QCustomPlot.tar.gz这个文件&#xff0c;里面包含源码和示例。实际上&#xff0c;我们只需要qcustompl…

[学习笔记]CS224W(图机器学习) 2022/2023年冬学习笔记

资料&#xff1a; 课程网址 斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】 斯坦福大学CS224W图机器学习公开课-同济子豪兄中文精讲 cs224w&#xff08;图机器学习&#xff09;2021冬季课程学习笔记集合 序言 到图神经网络GCN为止的内容参考了斯坦福CS224W图机…

XUbuntu22.04之查找进程号pidof、pgrep总结(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【zlm】 webrtc源码讲解

目录 前端WEB 服务器收到请求 服务端的处理 播放 拉流 参考文章 前端WEB 服务器收到请求 POST /index/api/webrtc?applive&streamtest&typeplay HTTP/1.1 HttpSession::onRecvHeaderHttpSession::Handle_Req_POSTHttpSession::Handle_Req_POSTif (totalConte…

雅思学习总结

#【中秋征文】程序人生&#xff0c;中秋共享# 雅思小科普&#xff1a; 1. 什么是雅思考试&#xff1f; 雅思考试是由&#xff1a;英国文化协会、澳洲 IDP 教育集团、剑桥 大学考试委员会举办的英语水平测试。全称翻译成中文是&#xff1a; 国际英语语言测试系统。 2…