React项目通过jsmind实现思维导图以及相关功能

news2024/11/15 10:53:25

jsMind

jsMind 是一个用于显示和编辑思维导图的纯 JavaScript 类库。它基于 CanvasSVG 进行设计,能够在现代浏览器中高效地运行。jsMindBSD 协议开源,这意味着可以在遵守该协议的前提下,将其嵌入到任何项目中使用。

功能特点

jsMind 提供了强大的脑图编辑功能,支持节点的添加、删除、移动等操作。它内置了多种主题,用户可以根据需要选择合适的主题,或者自定义主题。此外,通过 CSS 可以自定义节点的样式,包括背景色、字体颜色、鼠标悬停效果等。jsMind 还提供了丰富的 API,方便开发者进行二次开发和功能扩展。

效果图
在这里插入图片描述
接下来我会重新构建一个react项目,然后实现jsmind思维导图功能

代码结构

在这里插入图片描述
项目的入口文件是index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <App />
);

之后在App组件实现对应功能

import React from 'react';
import 'jsmind/style/jsmind.css';
import jsMind from 'jsmind';
import './index.css';
class App extends React.Component {
  componentDidMount() {
    var mind = {
      meta: {
        name: 'demo',
        author: 'yang',
        version: '0.2',
    },
    format: 'node_tree',
      data: {
          id: "root",
          topic: "city",
          children: [
            {
              id: "easy", // [必选] ID, 所有节点的ID不应有重复,否则ID重复的结节将被忽略
              topic: "杭州", // [必选] 节点上显示的内容
              direction: "right", // [可选] 节点的方向,此数据仅在第一层节点上有效,目前仅支持 left 和 right 两种,默认为 right
              // expanded: false, // [可选] 该节点是否是展开状态,默认为 true
              children: [
                {
                  id: "easy8",
                  topic: "滨江",
                  children: [
                    { id: "open7", topic: "海康威视" },
                    { id: "easy7", topic: "浙江大华" },
                  ],
                },
                { id: "easy2", topic: "上城" },
              ],
            },
            {
              id: "open",
              topic: "上海",
              direction: "right",
              // expanded: false,
              children: [
                { id: "open1", topic: "嘉定" ,
                   children: [
                  { id: "open45", topic: "阿里巴巴" },
                  { id: "easy56", topic: "斯凯孚" },
                ],
              },
                { id: "open2", topic: "浦东" },
                { id: "open3", topic: "徐汇" },
              ],
            },
 
            {
              id: "powerful",
              topic: "南京",
              direction: "right",
              // expanded: false,
 
              children: [
                { id: "powerful2", topic: "建邺" },
                { id: "powerful3", topic: "雨花台" },
              ],
            },
            {
              id: "other",
              topic: "苏州",
              direction: "right",
              // expanded: false,
 
              children: [
                { id: "other1", topic: "姑苏" },
                { id: "other2", topic: "吴中" },
              ],
            },
          ],
        },
      }
      const options = {
        container: 'jsmind_container',
        editable: true,
        theme: 'primary',
        mode: 'side',
        view: {
          line_width: 2, // 思维导图线条的粗细
          line_color: '#black' // 思维导图线条的颜色
      },

      };
    const jm = jsMind.show(options, mind);
    jm.add_event_listener(async (type, dat) => {
      if (type === 4 && dat.node !== 'root') {
            console.log('点击了这个节点');
      }
  });
}
      render(){
          return <div style={{ width: '100%', height: '100%', position: 'absolute', top: 0, left: 0 }}>
          <div id="jsmind_container" style={{ width: '100%', height: '100%'}} />
        </div>
  } 
}

export default App;

这里jsmind我直接从npm库安装并引入,省去了自己下载的麻烦

npm install jsmind

引入

import 'jsmind/style/jsmind.css';
import jsMind from 'jsmind';

在点击不同的jsmind节点时,可以使用这个代码进行逻辑书写

jm.add_event_listener(async (type, dat) => {
      if (type === 4 && dat.node !== 'root') {
            console.log('点击了这个节点');
      }
  });

因为在jsmind源码里面

    jm.event_type = { show: 1, resize: 2, edit: 3, select: 4 };

所以这么操作

但是修改样式有一些需要在node里面的jsmind.css里修改,但是我修改后不生效,可能是权重不够
在这里插入图片描述
所以我新建一个css文件,直接将要改的样式写在css里面,并加上!important

jmnode.root {
    font-size: 20px !important;
    font-family: "Times New Roman", sans-serif !important;
}
jmnode.selected {
    background-color: rgb(222, 160, 35) !important;
    color: #fff;
    box-shadow: 2px 2px 8px #000;
}
jmexpander {
    position: absolute;
    width: 13px;
    height: 11px;
    display: block;
    overflow: hidden;
    line-height: 10px;
    font-size: 20px !important;
    text-align: center !important;
    border-radius: 13px !important;
    border-width: 1px;
    border-style: solid;
    cursor: pointer;
}

之后在App组件中引入

import './index.css';

但是还有一个坑,就是StrictMode 引发的组件重复执行

如果你的index.js文件中是这样的

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

那么组件就会被渲染两次
在这里插入图片描述

这是因为在开发者模式中,StrictMode会将相应组件执行两次,所以删掉即可

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

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

相关文章

从0到1搭建用户管理系统

手把手教你搭建前后端框架 新手对于很多成熟框架&#xff0c;不知道如何搭建的&#xff0c;不知道如何实现等等&#xff0c;忙碌之余&#xff0c;写了一篇博客 手把手教你搭建前后端框架源码&#xff0c; springbootmysqlelementuivue 从0到1&#xff0c;搭建springboot框架&am…

windows下mysql启动失败无报错(已解决)

环境&#xff1a;win server 2012R2 mysql版本&#xff1a;8.0 今天使用net stop mysql;net start mysql进行重启&#xff0c;发现重启失败&#xff0c;而且提示服务没有任何错误。 接着就检查了所有的常见问题&#xff08;如端口占用、配置文件路径错误等&#xff09;仍然无…

024、架构_资源_主机

摘要 在主机管理界面,可查看 GoldenDB 使用的主机信息,可对主机执行新增、编辑、删除操作。 主机列表 选择菜单[资源管理→主机管理],进入主机列表界面。 新增主机(单个、批量) 新增主机流程: 添加

hexo d 报错

上学期四月份左右用hexogithub搭了一个简单的博客&#xff0c;开学回来发现运行hexo d就报错&#xff0c;试了好几种网上的方法解决。&#xff08;虽然好使了&#xff0c;但还是没弄明白啥原理&#xff0c;难道是token过期就不好使吗&#xff1f;&#xff09; 奇妙的解决方案 …

WD100电磁铁-国家实验室方案

根据合肥国家实验室磁场要求&#xff0c;上海天端实业有限公司设计制造WD100电磁铁&#xff0c;参数如下 水冷WD100电磁铁参数资料 产品规格 水冷型WD-100型电磁铁&#xff0c;卧式座放&#xff0c;磁场方向水平&#xff1b; 气隙双向可调&#xff0c;可调范围0-100mm&am…

【GeoScenePro】Generic Server Error

错误 解决方案 在portal中进行知识图谱许可授权

C语言指针进阶一:(字符指针,数组指针,指针数组,函数指针)

字符指针 在指针类型中我们知道字符指针类型&#xff0c;一般就是用于 char 的&#xff1a; int main() {char ch w;char* p &ch;*p a;return 0;} 还有一种使用方法&#xff1a; int main() {const char* pstr "hello bit";printf("%s\n", p…

亚马逊、temu自养号采购大额下单需要解决哪些技术要点?

自养号采购下单在跨境电商平台中是一个复杂且需要精细操作的过程&#xff0c;主要涉及多个技术要点以确保账号安全、提高下单成功率&#xff0c;并避免被平台风控系统识别。以下是需要解决的关键技术要点&#xff1a; 1. 纯净的测评环境 服务器与IP&#xff1a;使用高纯净度的…

java实现发邮件功能的方式?如何使用java?

java实现发邮件的配置步骤&#xff1f;如何用java实现发信功能&#xff1f; Java实现发邮件功能是一个非常常见且重要的需求。无论是用于用户注册确认、密码重置还是系统通知&#xff0c;Java实现发邮件功能都能提供强大的支持。AokSend将详细介绍几种常用的Java实现发邮件功能…

模板方法详解

1.基本介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c; 在一个抽象类公开定义了执行 它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。简单说&…

【系统分析师】-计算题-净现值与投资回报率

1、某企业准备开发一个信息管理系统&#xff0c;其生存周期为5年。该系统的预计开发成本、预计的年运行/维护成本&#xff0c;以及预计的收益如下表所示&#xff08;其中带括号的数据表示负值&#xff09;。 问题1 &#xff08;1&#xff09;目前许多管理人员将投资的净现值作为…

Ribbon负载均衡底层原理

springcloude服务实例与服务实例之间发送请求&#xff0c;首先根据服务名注册到nacos&#xff0c;然后发送请求&#xff0c;nacos可以根据服务名找到对应的服务实例。 SpringCloudRibbon的底层采用了一个拦截器&#xff0c;拦截了openfeign发出的请求&#xff0c;对地址做了修…

Qt 实现不规则的部件或者窗口

1、实现不规则的部件 1.1 工程目录 1.2 界面实现 1.3 widget.cpp #include "widget.h" #include <QPixmap> #include <QBitmap> #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->set…

AI人工智能_Prompt提示词工程如何生成API接口文档

AI人工智能_Prompt提示词工程如何生成API接口文档&#xff1f;在与AI大模型的交互中&#xff0c;每当我们输入一段文字&#xff0c;无论是问题、命令还是陈述&#xff0c;这段文字就是一个Prompt。 Prompt提示词工程&#xff08;Prompt Engineering&#xff09;是一种技术或方…

【C++】—— string 类的了解与使用

【CPP】—— string类的了解与使用 1、 为什么学习string 类1.1、 C语言中的字符串1.2、 面试题中更多以 string 类出现 2、 标准库中的 string 类3、 string 的默认成员函数3.1、 string 的构造与拷贝构造3.2、 string 的赋值重载3.3、 string 的析构函数 4、 operator[ ]4.1、…

ADAS---基于检测框的单目测距方法

1.1.模型求解法方法解读&#xff1a; Yolo模型可以输出被检测物体的置信度、类别及检测框的中心点坐标(xc,yc)及宽高(w,h)等信息&#xff0c;选取车辆检测框底部的中点作为距离测量的特征点&#xff0c;其计算公式如下&#xff1a; 车辆测距示意图如下&#xff1a; 图中&#…

Zabbix之ubuntu环境下最新版zabbix-server7.0安装

一、zabbix7.0简介 Zabbix 7.0 是 Zabbix 系列中的一个主要版本&#xff0c;提供了增强的监控功能、改进的性能和扩展的可用性。Zabbix 是一个开源的企业级监控解决方案&#xff0c;用于监控服务器、虚拟机、网络设备、应用程序、服务等各类 IT 基础设施。Zabbix 7.0 继承了之前…

基于ZigBee的老人家庭监护报警设计

1 整体方案设计 本设计老人家庭监护报警系统的整体架构如图2.1所示&#xff0c;包括终端节点、协调器、上位机三个部分&#xff0c;其各个部分功能如下&#xff1a; 终端节点&#xff1a;以CC2530单片机为控制核心&#xff0c;结合心率传感器、DS18B20温度传感器、压力传感器…

大语言模型Token

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlToken概述 Token的定义与分类 基本定义 Token是自然语言处理(NLP)和机器学习中的基本单元,它代表文本中的一个有意义的片段,如单词、短语或子词。在大型语言模型(LLM)中,Token是模型理解…

docker 介绍以及常用命令

文章目录 Docker 概述docker 概念安装 Docker核心概念Docker 镜像Docker 容器Docker 仓库 docker 与虚拟机比较 Docker 命令docker 进程相关命令镜像相关命令查看本地镜像搜索镜像拉取/推送镜像删除镜像 容器相关命令创建容器查看容器启动/终止/删除容器新建并启动容器进入容器…