vue2集成可在线编辑的思维导图(simple-mind-map)

news2025/5/17 23:13:55

最近要求做一个可在线编辑的思维导图,经过层层调研和实测,最简单的思维导图导图实现还得是simple-mind-map组件

simple-mind-map中文文档
当前我使用的是vue2项目,目前没试过是否支持vue3,但是看官网描述他们也给了有vue3的demo项目

集成方式

1.node版本:16.20.2(官方使用的版本是14)
2.执行:npm i simple-mind-map
3.看图片描述
transpileDependencies: [‘simple-mind-map’]
在这里插入图片描述
到这里集成结束

实现代码

<template>
  <div class="flow-chart-container">
    <div id="mindMapContainer"></div>
    <!-- 右键菜单 -->
    <div
      class="context-menu"
      v-show="show"
      :style="{ left: left + 'px', top: top + 'px' }"
    >
      <div class="menu-item" @click="insertChild" v-if="type === 'node'">
        插入子节点
      </div>
      <div
        class="menu-item"
        @click="insertSibling"
        v-if="type === 'node' && !isRoot"
      >
        插入同级节点
      </div>
      <div
        class="menu-item"
        @click="insertParent"
        v-if="type === 'node' && !isRoot"
      >
        插入父节点
      </div>
      <div
        class="menu-item"
        @click="deleteNode"
        v-if="type === 'node' && !isRoot"
      >
        删除节点
      </div>
      <div
        class="menu-item"
        @click="moveUp"
        v-if="type === 'node' && !isRoot && !isFirst"
      >
        上移节点
      </div>
      <div
        class="menu-item"
        @click="moveDown"
        v-if="type === 'node' && !isRoot && !isLast"
      >
        下移节点
      </div>
    </div>
  </div>
</template>

<script>
import MindMap from "simple-mind-map";
export default {
  name: "FlowChart",
  data() {
    return {
      mindMap: null,
      // 右键菜单相关数据
      type: "", // 当前右键点击的类型
      currentNode: null, // 当前右键点击的节点
      left: 0, // 菜单显示的位置
      top: 0,
      show: false, // 是否显示菜单
      isRoot: false, // 是否是根节点
      isFirst: false, // 是否是同级第一个节点
      isLast: false, // 是否是同级最后一个节点
    };
  },
  mounted() {
    this.mindMap = new MindMap({
      el: document.getElementById("mindMapContainer"),
      enableFreeDrag: true,
      data: {
        data: {
          text: "根节点",
        },
        children: [],
      },
    });

    // 监听节点右键事件
    this.mindMap.on("node_contextmenu", (e, node) => {
      e.preventDefault();
      this.type = "node";
      this.left = e.clientX + 10;
      this.top = e.clientY + 10;
      this.show = true;
      this.currentNode = node;

      // 判断节点类型
      this.isRoot = node.isRoot;
      if (!this.isRoot) {
        const siblings = node.parent.children;
        this.isFirst = siblings[0] === node;
        this.isLast = siblings[siblings.length - 1] === node;
      }
    });

    // 点击其他区域隐藏菜单
    this.mindMap.on("node_click", this.hideMenu);
    this.mindMap.on("draw_click", this.hideMenu);
  },
  methods: {
    // 隐藏菜单
    hideMenu() {
      this.show = false;
      this.left = 0;
      this.top = 0;
      this.type = "";
      this.currentNode = null;
    },
    // 插入子节点
    insertChild() {
      console.log("插入子节点");
      this.mindMap.execCommand("INSERT_CHILD_NODE", this.currentNode);
      this.hideMenu();
    },
    // 插入同级节点
    insertSibling() {
      this.mindMap.execCommand("INSERT_NODE", this.currentNode);
      this.hideMenu();
    },
    // 插入父节点
    insertParent() {
      this.mindMap.execCommand("INSERT_PARENT_NODE", this.currentNode);
      this.hideMenu();
    },
    // 删除节点
    deleteNode() {
      this.mindMap.execCommand("REMOVE_NODE", this.currentNode);
      this.hideMenu();
    },
    // 上移节点
    moveUp() {
      this.mindMap.execCommand("UP_NODE", this.currentNode);
      this.hideMenu();
    },
    // 下移节点
    moveDown() {
      this.mindMap.execCommand("DOWN_NODE", this.currentNode);
      this.hideMenu();
    },
  },
};
</script>

<style lang="scss" scoped>
#mindMapContainer {
  width: 100%;
  height: 100%;
}
#mindMapContainer * {
  margin: 0;
  padding: 0;
}

.flow-chart-container {
  width: 100%;
  height: 100vh;
  position: relative;
  overflow: hidden;
}

.context-menu {
  position: fixed;
  background: #fff;
  border-radius: 4px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  padding: 5px 0;
  z-index: 1000;

  .menu-item {
    padding: 7px 16px;
    cursor: pointer;
    font-size: 14px;
    color: #333;
    transition: all 0.3s;

    &:hover {
      background: #f5f5f5;
    }
  }
}
</style>

至于导出和导入就自己照着官网加吧,我用不到就不加了

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

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

相关文章

如何在Windows右键新建菜单中添加自定义项,将notepad添加到新建菜单

一、简介 Windows 右键新建菜单的核心管理机制隐藏在注册表的 HKEY_CLASSES_ROOT 根键中。这里存在两种关键注册表项&#xff1a;文件扩展名项和文件类型项&#xff0c;它们共同构成了新建菜单的完整控制体系。 以常见的.txt文件为例&#xff0c;系统通过以下机制实现新建菜单…

CS016-4-unity ecs

【37】将系统转换为任务 Converting System to Job 【Unity6】使用DOTS制作RTS游戏|17小时完整版|CodeMonkey|【37】将系统转换为任务 Converting System to Job_哔哩哔哩_bilibili a. 将普通的方法&#xff0c;转化成job。第一个是写一个partial struct xxx&#xff1b;第二…

微信小程序第三方代开发模式技术调研与实践总结

🚀 微信小程序第三方代开发模式技术调研与实践总结 📖 前言 随着企业对私有化品牌运营诉求的增加,许多大型客户希望将原本由 SaaS 平台统一提供的小程序迁移至自有主体(AppID)下运行,同时又希望继续沿用 SaaS 平台的业务服务与数据托管方式。微信开放平台提供的“小程…

upload-labs通关笔记-第8关 文件上传之点绕过

目录 一、点绕过原理 二、deldot()函数 三、源码分析 四、渗透实战 1、构建脚本test8.php 2、打开靶场 3、bp开启拦截 4、点击上传 5、bp拦截 6、后缀名增加点 7、发包并获取脚本地址 8、访问脚本 本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗…

PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试

Title: PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试 文章目录 I . PolygonMesh1. PolygonMesh 结构体2. Vertices 结构体与点云索引3. 测试 PolygonMesh II. TextureMesh1. TextureMesh 结构体2. TexMaterial 结构体3. 纹理坐标与纹理坐标索引4. 测试 TextureMesh 以下…

量子算法:开启计算新时代的技术密码

摘要 量子算法是利用量子力学特性&#xff08;如叠加态、纠缠、干涉&#xff09;设计的计算模型&#xff0c;在特定问题上相比经典算法具有指数级加速优势。本文深入探讨了量子算法的核心原理、代表性算法及其在多个领域的应用&#xff0c;分析了量子算法面临的挑战与未来发展…

多线程代码案例-1 单例模式

单例模式 单例模式是开发中常见的设计模式。 设计模式&#xff0c;是我们在编写代码时候的一种软性的规定&#xff0c;也就是说&#xff0c;我们遵守了设计模式&#xff0c;代码的下限就有了一定的保证。设计模式有很多种&#xff0c;在不同的语言中&#xff0c;也有不同的设计…

CSS实现文本自动平衡text-wrap: balance

不再有排版孤行和寡行 我们都知道那些标题&#xff0c;最后一个单词换行并单独站在新行上&#xff0c;破坏了视觉效果&#xff0c;看起来很奇怪。当然&#xff0c;有老式的 手动换行或将内容分成不同部分。但您听说过text-wrap: balance吗&#xff1f; 通过应用text-wrap: bal…

mac M芯片运行docker-desktop异常问题

虽然mac已经迭代到m4了&#xff0c;但官方的docker-desktop运行仍然有问题&#xff0c;包括但不限于&#xff1a; 命令行docker找不到docker-desk打不开docker-desktop闪退容器起不来 尝试不同版本后&#xff0c;看到了其他可以在mac跑docker的开源方法&#xff0c;更简单、轻…

事件响应策略规范模版

事件响应策略 一、事件分级定义 根据事件对业务的影响程度和紧急程度,将事件分为 4个等级(P1-P4),明确各级事件的判定标准:、 二、响应时效承诺 响应时间(从事件确认到首次回复) P1 事件:15 分钟内响应(724 小时电话 / 工单优先接入) P2 事件:30 分钟内响应(工…

MGX:多智能体管理开发流程

MGX的多智能体团队如何通过专家混合系统采用全新方法,彻底改变开发流程,与当前的单一智能体工具截然不同。 Lovable和Cursor在自动化我们的特定开发流程方面取得了巨大飞跃,但问题是它们仅解决软件开发的单一领域。 这就是MGX(MetaGPT X)的用武之地,它是一种正在重新定…

采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作

采购审批流程全靠人推进&#xff0c;内耗严重&#xff0c;效率低下&#xff1f; 花重金上了OA&#xff0c;结果功能有局限、不灵活&#xff1f; 问题出在哪里&#xff1f;是我们的要求太多、太苛刻吗&#xff1f;NO&#xff01; 流程名称&#xff1a; 采购审批管理 流程功能…

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…

Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发

介绍 CDN&#xff08;内容分发网络&#xff09;通过全球分布的边缘节点&#xff0c;让用户从最近的服务器获取资源&#xff0c;减少网络延迟&#xff0c;显著提升JS、CSS等静态文件的加载速度。公共库&#xff08;如Vue、React、Axios&#xff09;托管在CDN上&#xff0c;减少…

接触感知 钳位电路分析

以下是NG板接触感知电路的原理图。两极分别为P3和P4S&#xff0c;电压值P4S < P3。 电路结构分两部分&#xff0c;第一部分对输入电压进行分压钳位。后级电路使用LM113比较器芯片进行电压比较&#xff0c;输出ST接触感知信号。 钳位电路输出特性分析 输出电压变化趋势&a…

使用 gcloud CLI 自动化管理 Google Cloud 虚拟机

被操作的服务器&#xff0c;一定要开启API完全访问权限&#xff0c;你的电脑安装gcloud CLI前一定要先安装Python3&#xff01; 操作步骤 下载地址&#xff0c;安装大概需要十分钟&#xff1a;https://cloud.google.com/sdk/docs/install?hlzh-cn#windows 选择你需要的版本&a…

SQL语句,索引,视图,存储过程以及触发器

一、初识MySQL 1.数据库 按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合&#xff1b; 2.OLTP与OLAP OLTP&#xff08; On-Line transaction processing &#xff09;翻译为联机事务处理&am…

7. 进程控制-进程替换

目录 1. 进程替换 1.1 单进程版&#xff1a; 1.2 进程替换的原理 1.3 多进程版-验证各种程序替换接口 2. 进程替换的各种接口 2.1 execl 2.2 execlp 2.3 execv 2.4 execvp 2.5 execle 1. 进程替换 上图为程序替换的接口&#xff0c;之后会详细介绍。 1.1 单进程版&am…

理解 C# 中的各类指针

前言 变量可以理解成是一块内存位置的别名&#xff0c;访问变量也就是访问对应内存中的数据。 指针是一种特殊的变量&#xff0c;它存储了一个内存地址&#xff0c;这个内存地址代表了另一块内存的位置。 指针指向的可以是一个变量、一个数组元素、一个对象实例、一块非托管内存…

真题卷001——算法备赛

蓝桥杯2024年C/CB组国赛卷 1.合法密码 问题描述 小蓝正在开发自己的OJ网站。他要求用户的密码必须符合一下条件&#xff1a; 长度大于等于8小于等于16必须包含至少一个数字字符和至少一个符号字符 请计算一下字符串&#xff0c;有多少个子串可以当作合法密码。字符串为&am…