vue纯手写思维导图,拒绝插件(cv即用)
创始人
2024-04-16 17:13:25
0

vue纯手写思维导图,拒绝插件(cv即用)

已完成功能点:折叠、放大、缩小、移动
后续增加功能点:添加、删除

先看结果:

在这里插入图片描述

有这么个需求,按照层级关系,把表格放在思维导图上,我第一时间想到用插件,但是找了好久都没有找到比较合适的插件,决定自己手写一个

第一步:

理论猜想

模拟一个带有层级关系的数据格式,并且可以在vue组件中需要做成组件递归形式,左侧父级永远包含右侧子集。左侧A盒子,右侧F盒子用flex布局B/C/D竖着排列,右侧3个div分别用伪元素分别做3根横线,F盒子设置border-left 竖线,这样一拼接就感觉像是一个思维导图了,理论先这样,但是还没有想到B盒子的左侧横线和F盒子竖线交叉之后,上面圆圈多余的部分怎么去除。先动手再说,碰到问题再想着怎么处理问题。
在这里插入图片描述

第二步:

动手实践

模拟数据: 设置listCache 模拟数据 带有层级关系的格式,id是唯一的,这样做为了后期可能操作表格的时候方便找到唯一的表格。
递归组件: mindItem.vue里面的name属性名称设置 mindItem,然后再mindItem.vue组件里面再次引入即可递归
多余线段去除: 刚开始的做法是直接设置子集的border-left,这样的问题会造成有线段空出来,显得很多余,转换一个思路。

  • 设置B和A的连接:请看图2 把第一个div的伪元素::after设置border-left: solid 2px blue;height: 50%;bottom: 0; 这样做是让线段1向下展示,高度只有B盒子的一半,这样就感觉像线段拐弯了,从A连接到B的样式,其实是多个线段拼接起来而已。
  • 设置D和A的连接:请看图2 把第最后一个div的伪元素::after设置border-left: solid 2px #000; height: 50%; top: 0; 这样做是让线段3向上展示,高度只有C盒子的一半,这样就感觉像线段拐弯了,从A连接到C的样式,其实是多个线段拼接起来而已。
  • 设置C和A的连接:请看图2 把中间div的伪元素::after设置border-left: solid 2px yellowgreen; height: 100%; 处在中间地段的div盒子不必考虑线段拐弯问题,高度100%就行了和上下的盒子的线段连接起来就好了

图2:

在这里插入图片描述


src/views/mind/components/mindItem.vue

src/views/mind/mind.vue


src/views/mind/components/index.js

export function expendfn({list = [],id = '',isExpend = false // 默认展开/关闭
}) {if (list.length === 0) return [];let arr = JSON.parse(JSON.stringify(list));id === '' && !isExpend && defaultfn(arr, id, isExpend); // 刷新// 刷新function defaultfn(lists) {lists.forEach((x) => {x.isExpandBefore = false;x.isExpandAfter = falseif (x.children) defaultfn(x.children);});}return arr;
}

src/router/index.js

import Vue from 'vue'
Vue.use(VueRouter)
const routes = [{path: '/mind',naem: 'mind',component: () => import('@/views/mind/mind.vue')
}, ]const router = new VueRouter({routes
})export default router

src/main.js

import '@/directive/index.js'
import 'element-ui/lib/theme-chalk/index.css';import App from './App.vue'
import ElementUI from 'element-ui';
import Vue from 'vue'
import jm from 'vue-jsmind'
import router from './router'
import store from './store'Vue.config.productionTip = false
Vue.use(ElementUI);Vue.use(jm)
if (window.jsMind) {console.log('wind')Vue.prototype.jsMind = window.jsMind
}
new Vue({router,store,render: h => h(App)
}).$mount('#app')

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...