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

 更新时间:2025年04月10日 10:49:46   作者:前端极客探险家  
思维导图是一种用于表示信息、想法和概念的图形化工具,本文将基于 Vue3和VueDraggable实现一个简单的思维导图组件,支持节点拖拽,编辑及节点之间的关系连接,希望对大家有所帮助

一、前言

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

二、技术选型

Vue 3:现代的前端框架,适合构建响应式和交互丰富的组件。

VueDraggable:一个 Vue 的拖拽插件,能够轻松实现元素拖拽功能。

Canvas 或 SVG:用来绘制节点间的连接线条。

三、思维导图组件设计

3.1 功能需求

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

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

3.2 组件结构

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

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

四、实现步骤

4.1 设置 Vue 3 项目

首先,创建一个新的 Vue 3 项目:

vue create mind-map

安装所需的依赖包:

npm install vue-draggable

4.2 创建思维导图组件

画布组件

我们首先创建一个画布组件,容纳所有的节点和连接线。

<template>
  <div class="canvas" ref="canvasRef">
    <MindNode v-for="node in nodes" :key="node.id" :node="node" @update-node="updateNode"/>
    <svg class="connections">
      <line v-for="(line, index) in connections" :key="index" :x1="line.x1" :y1="line.y1" :x2="line.x2" :y2="line.y2" stroke="black"/>
    </svg>
  </div>
</template>

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

export default {
  components: {
    MindNode,
  },
  data() {
    return {
      nodes: [
        { id: 1, x: 100, y: 100, title: 'Node 1' },
        { id: 2, x: 300, y: 200, title: 'Node 2' },
      ],
      connections: [
        { x1: 100, y1: 100, x2: 300, y2: 200 },
      ]
    };
  },
  methods: {
    updateNode(id, newTitle) {
      const node = this.nodes.find(n => n.id === id);
      if (node) node.title = newTitle;
    }
  }
};
</script>

<style scoped>
.canvas {
  position: relative;
  width: 100%;
  height: 100vh;
  background-color: #f9f9f9;
}
.connections line {
  stroke-width: 2;
}
</style>

节点组件

每个节点可以单独作为一个组件,用 VueDraggable 实现拖拽效果,并允许用户编辑节点标题。

<template>
  <div class="node" v-bind:style="{ left: node.x + 'px', top: node.y + 'px' }" v-draggable @drag="onDrag">
    <input type="text" v-model="node.title" @input="updateNodeTitle" />
  </div>
</template>

<script>
export default {
  props: ['node'],
  methods: {
    onDrag(event) {
      this.node.x += event.movementX;
      this.node.y += event.movementY;
      this.$emit('update-node', this.node.id, this.node.title);
    },
    updateNodeTitle() {
      this.$emit('update-node', this.node.id, this.node.title);
    }
  }
};
</script>

​​​​​​​<style scoped>
.node {
  position: absolute;
  background-color: #fff;
  border: 2px solid #ddd;
  padding: 10px;
  border-radius: 5px;
  cursor: pointer;
  min-width: 150px;
}
.node input {
  border: none;
  background: transparent;
  font-size: 16px;
  text-align: center;
}
</style>

4.3 连接线的自动调整

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

4.4 完整实现

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

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

五、总结

通过使用 Vue 3 和 VueDraggable,我们成功实现了一个简易的思维导图组件,支持拖拽、节点编辑和自动调整连接线。这个组件可以作为基础,扩展出更多的功能,适用于在线协作、课程规划等场景。

到此这篇关于使用Vue3实现一个简单的思维导图组件的文章就介绍到这了,更多相关Vue3思维导图组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue实现验证码按钮倒计时功能

    vue实现验证码按钮倒计时功能

    最近项目结束,空闲时间比较多,今天小编抽时间给大家使用vue写一个小例子,就决定做验证码倒计时功能,具体实例代码大家参考下本文
    2018-04-04
  • 解决vue 打包发布去#和页面空白的问题

    解决vue 打包发布去#和页面空白的问题

    今天小编就为大家分享一篇解决vue 打包发布去#和页面空白的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • ant design vue 清空upload组件图片缓存的问题

    ant design vue 清空upload组件图片缓存的问题

    这篇文章主要介绍了ant design vue 清空upload组件图片缓存的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue3+vant4封装日期时间组件方式(年月日时分秒)

    vue3+vant4封装日期时间组件方式(年月日时分秒)

    这篇文章主要介绍了vue3+vant4封装日期时间组件方式(年月日时分秒),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue实现右键菜单组件的超详细教程(支持快捷键)

    Vue实现右键菜单组件的超详细教程(支持快捷键)

    右键菜单组件非常常见,所有的前端开发工程师都会遇到类似的功能组件开发需求,这篇文章主要给大家介绍了关于Vue实现右键菜单组件的超详细教程,文中介绍的方法支持快捷键,需要的朋友可以参考下
    2024-02-02
  • axios拦截器工作方式及原理源码解析

    axios拦截器工作方式及原理源码解析

    这篇文章主要为大家介绍了axios拦截器工作原理源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • vue点击单张图片放大实现步骤(纯js)

    vue点击单张图片放大实现步骤(纯js)

    这篇文章主要给大家介绍了关于vue点击单张图片放大实现的相关资料,在vue项目中实现点击图片放大功能相信对大家来说都不陌生,文中给出了详细的js示例代码,需要的朋友可以参考下
    2023-07-07
  • vue Draggable实现拖动改变顺序

    vue Draggable实现拖动改变顺序

    这篇文章主要为大家详细介绍了vue Draggable实现拖动改变顺序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vuejs对接后端踩过的坑记录

    vuejs对接后端踩过的坑记录

    这篇文章主要介绍了vuejs对接后端踩过的坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • vue在data中定义变量后依旧报undefined的解决

    vue在data中定义变量后依旧报undefined的解决

    这篇文章主要介绍了vue在data中定义变量后依旧报undefined的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论