• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    使用Vue3实现一个简单的思维导图组件

    发布者: 雪落无声 | 发布时间: 2025-6-16 07:43| 查看数: 83| 评论数: 0|帖子模式

    一、前言

    思维导图是一种用于表示信息、想法和概念的图形化工具。通过将内容分层次的组织和连接,帮助用户更好地理解和记忆。今天,我们将基于 Vue 3 和 VueDraggable,一起实现一个简单的思维导图组件,支持节点拖拽、编辑及节点之间的关系连接。

    二、技术选型

    Vue 3:现代的前端框架,适合构建响应式和交互丰富的组件。
    VueDraggable:一个 Vue 的拖拽插件,能够轻松实现元素拖拽功能。
    Canvas 或 SVG:用来绘制节点间的连接线条。

    三、思维导图组件设计


    3.1 功能需求

    我们要实现的思维导图组件需要具备以下功能:

    • 节点拖拽:用户能够自由地拖动每个节点。
    • 节点编辑:用户可以修改节点的名称。
    • 节点关系:用户可以通过连线将节点与节点之间的关系展示出来。
    • 自适应布局:当节点被拖动时,自动调整连接线的位置。

    3.2 组件结构

    思维导图组件可以分为以下几部分:

    • 节点组件:展示每个节点的内容(文本、标题等)。
    • 连接线组件:通过直线或曲线连接节点之间的关系。
    • 画布组件:包含所有节点和连接线的容器。

    四、实现步骤


    4.1 设置 Vue 3 项目

    首先,创建一个新的 Vue 3 项目:
    1. vue create mind-map
    复制代码
    安装所需的依赖包:
    1. npm install vue-draggable
    复制代码
    4.2 创建思维导图组件

    画布组件
    我们首先创建一个画布组件,容纳所有的节点和连接线。
    1. <template>
    2.   <div class="canvas" ref="canvasRef">
    3.     <MindNode v-for="node in nodes" :key="node.id" :node="node" @update-node="updateNode"/>
    4.     <svg class="connections">
    5.       <line v-for="(line, index) in connections" :key="index" :x1="line.x1" :y1="line.y1" :x2="line.x2" :y2="line.y2" stroke="black"/>
    6.     </svg>
    7.   </div>
    8. </template>

    9. ​​​​​​​<script>
    10. import MindNode from './MindNode.vue';

    11. export default {
    12.   components: {
    13.     MindNode,
    14.   },
    15.   data() {
    16.     return {
    17.       nodes: [
    18.         { id: 1, x: 100, y: 100, title: 'Node 1' },
    19.         { id: 2, x: 300, y: 200, title: 'Node 2' },
    20.       ],
    21.       connections: [
    22.         { x1: 100, y1: 100, x2: 300, y2: 200 },
    23.       ]
    24.     };
    25.   },
    26.   methods: {
    27.     updateNode(id, newTitle) {
    28.       const node = this.nodes.find(n => n.id === id);
    29.       if (node) node.title = newTitle;
    30.     }
    31.   }
    32. };
    33. </script>

    34. <style scoped>
    35. .canvas {
    36.   position: relative;
    37.   width: 100%;
    38.   height: 100vh;
    39.   background-color: #f9f9f9;
    40. }
    41. .connections line {
    42.   stroke-width: 2;
    43. }
    44. </style>
    复制代码
    节点组件
    每个节点可以单独作为一个组件,用 VueDraggable 实现拖拽效果,并允许用户编辑节点标题。
    1. <template>
    2.   <div class="node" v-bind:style="{ left: node.x + 'px', top: node.y + 'px' }" v-draggable @drag="onDrag">
    3.     <input type="text" v-model="node.title" @input="updateNodeTitle" />
    4.   </div>
    5. </template>

    6. <script>
    7. export default {
    8.   props: ['node'],
    9.   methods: {
    10.     onDrag(event) {
    11.       this.node.x += event.movementX;
    12.       this.node.y += event.movementY;
    13.       this.$emit('update-node', this.node.id, this.node.title);
    14.     },
    15.     updateNodeTitle() {
    16.       this.$emit('update-node', this.node.id, this.node.title);
    17.     }
    18.   }
    19. };
    20. </script>

    21. ​​​​​​​<style scoped>
    22. .node {
    23.   position: absolute;
    24.   background-color: #fff;
    25.   border: 2px solid #ddd;
    26.   padding: 10px;
    27.   border-radius: 5px;
    28.   cursor: pointer;
    29.   min-width: 150px;
    30. }
    31. .node input {
    32.   border: none;
    33.   background: transparent;
    34.   font-size: 16px;
    35.   text-align: center;
    36. }
    37. </style>
    复制代码
    4.3 连接线的自动调整

    我们使用 SVG 元素绘制连接线,当节点位置发生变化时,重新计算连接线的坐标,确保连接始终保持正确。

    4.4 完整实现

    此时,我们的思维导图组件已经具备了基本的功能:节点拖拽、编辑和节点关系的连接。你可以根据需求继续添加更多的功能,例如:

    • 节点的删除功能
    • 可调整的节点大小
    • 支持多个级别的树形结构

    五、总结

    通过使用 Vue 3 和 VueDraggable,我们成功实现了一个简易的思维导图组件,支持拖拽、节点编辑和自动调整连接线。这个组件可以作为基础,扩展出更多的功能,适用于在线协作、课程规划等场景。
    到此这篇关于使用Vue3实现一个简单的思维导图组件的文章就介绍到这了,更多相关Vue3思维导图组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/javascript/339367eyt.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表