react hocks ggeditor 脑图开发(双向细目表), 实用技巧

2023-05-16

ggeditor脑图开发

目录

  1. 配置说明
  2. api介绍
    ①,引入插件
    ②,获取api (withPropsAPI)
    ③,获取node api
    ④,常用api汇总
    ⑤,绑定事件
  3. 功能实现,api使用
    ①,查找节点,并居中显示 (setSelect 不居中)
    ②,切换数据之后居中显示
    ③,禁止指定node被修改

1,配置说明

ggeidtor 版本: 2.0.2
其他版本:很高(node,react,umi,  Ant Design)
说明:
	用的 Ant Design Pro 为底子开发的项目,他给的ggeditor版本较低,但样式不错,且工具模块好用,所以不做升级

参考网址
g6官网: https://g6.antv.antgroup.com/api/graph           (某些api能用)
语雀文档: https://www.yuque.com/blueju/gg-editor

因项目实际需求,本文侧重点:1,选择node,2,获取点dom以及canvas内部点,3,一部分api介绍

2, api介绍

①,引入插件

// 引入
// cnpm install --save gg-editor
// yarn add --save gg-editor
import GGEditor, { Mind, withPropsAPI } from 'gg-editor';

// 初始化
const mindContent = useRef();
<GGEditor ref={mindContent} className={styles.editor}>
<Mind 
	onNodeClick={(obj: any) => {bindCruxGroupHandler(obj)}} 
	onMouseDown={(obj: any) => {mindShouldUpdate(obj)}} 
	data={data} 
	className={styles.mind} 
/>
</GGEditor>

// data
//   1, 引入 json
import drawDataGroup from './drawDataGroup.json';
//   2, 数据格式 (根据ggeidtor版本不同,数据格式也不同)
const [data, setData] = useState({
    roots:[
      {
        id: '0',
        key: '0',
        label: '知识点',
        children: []
      }
    ]
});
const [data, setData] = useState([
      {
        id: '0',
        key: '0',
        label: '知识点',
        children: []
      }
]);

样式调整

// 新版本中, 如果遇到样式问题(典型问题:node之间间距太大,留白太多)等问题,可参考以下配置
/**
 * 注意, 以下配置仅做参考,并未投入测试以及使用,只作参考, 只作参考, 只作参考, 只作参考
*/
<Mind 
data={data} 
graphConfig={{
          defaultNode: {// 节点配置
            // style: {{fill: '#333'}}
            size: [100, 30],
            // top: -15,
            // shape: 'rect',
            type: 'rect',// 形状 // rect circle dagre
            // fontSize: 30;
            // type: 'startNode',// 'easeLinear' | 'easePolyIn' | 'easePolyOut' | 'easePolyInOut' | 'easeQuad' | 'easeQuadIn' | 'easeQuadOut' | 'easeQuadInOut'
            anchorPoints: [ // 左右接入点的位置
                [0, 0.5], // 左中 [0, 0] 左下 [0, 1] 左上
                [1, 0.5], // 右中
            ]
          },
          nodeStateStyles:{
            // fill: '#fff',
            // size: 10,
            // stroke: '#fff',
          },
          edgeStateStyles: {
            // fill: '#fff',
            // stroke: '#fff',
            lineWidth: '2',
          },
          comboStateStyles: {
            fill: 'red',
            stroke: 'red',
          },
          defaultEdge: {// 边的配置
            type: 'cubic-horizontal', // 类型
            // style: {
            //     stroke: '#A3B1BF',
            // },
            // style: {
            //   fill: 'red'
            // }
            // size: 1
          },
          defaultCombo: {
            // type: 'rect',
            shape: 'rect',
            size: '0'
          },
          // layout: {
          //   // type: 'force2',
          //   // rankdir: 'LR', // 可选,默认为图的中心
          //   // align: 'DL', // 可选
          //   // nodesep: 0, // 可选
          //   // ranksep: 50, // 可选
          //   // controlPoints: true, // 可选
          // },
          layout: { // 默认布局
            type: 'mindmap', // 类型
            direction: 'H', // 方向
            // getHeight: () => { // 节点的高度
            //     return 16;
            // },
            // getWidth: () => { // 节点的宽度
            //     return 16;
            // },
            getVGap: () => { // 节点的垂直间隙
                return 10;
            },
            getHGap: () => { // 节点的水平间隙
                return 50;
            },
          },
          // fitView:true, // 初始位置居中显示全
          fitCenter: true,
          directed: true,
          fitViewPadding: [1, 1, 1, 1],// 初始位置居中显示 , 不考虑能否显示完整
          autoPaint: true,
          // groupStyle: {
          //   style: {
          //     'fill': 'red'
          //   }
          // }
          // groupByTypes: false,// 节点是否在分组内
          // linkCenter: true, // 是否连接在节点中间
          modes: { // 设置默认mode 和 behavior
            default: [
                {
                    type: 'collapse-expand',
                    onChange: function onChange(item, collapsed) {
                        const data = item.get('model').data;
                        data.collapsed = collapsed;
                        return true;
                    },
                },
                'drag-canvas',
                'zoom-canvas',
            ],
          }
        }}
 >
 </Mind>

② 获取api (withPropsAPI)

console.log(mindContent.current)
// 下方api, 很多都没用, 酌情研究
// 重点查看的api为 .current.propsAPI.currentPage 这个是整个canvas的api

在这里插入图片描述

③ 获取node api

// 注意看上方 mindContent 为标签<GGEditor>的 ref
let node = mindContent.current.propsAPI.find('0') 
console.log(node)

在这里插入图片描述

④ 常用api汇总

  mindContent.current.propsAPI.currentPage.setSelected(node, text)
api功能
mindContent.current.propsAPI.find(‘0’) ( ‘0’为node 的 id)查找结点
node.graph.getPoint({x: document.body.clientWidth/2,y: document.body.clientHeight/2-60})获取canvas点的位置
node.graph.getCanvasPoint({x:0,y:0})获取canvas点位置,在dom中使用
mindContent.current.propsAPI.currentPage.clearSelected()清除所有选中节点
mindContent.current.propsAPI.currentPage.clearActived()清除所选选中节点
mindContent.current.propsAPI.currentPage.clearItemActived(item)清除所选节点
mindContent.current.propsAPI.currentPage.update(item,{label: text})更新节点
mindContent.current.propsAPI.currentPage.getSelected()获取所选节点
mindContent.current.propsAPI.currentPage.getZoom()放大倍数

⑤ 绑定事件

上方有介绍

<Mind 
	onNodeClick={(obj: any) => {bindCruxGroupHandler(obj)}} 
	onMouseDown={(obj: any) => {mindShouldUpdate(obj)}} 
	data={data} 
	className={styles.mind} 
/>

3, 功能实现,api使用

①, 查找节点,并居中显示 (setSelect 不居中)

 <TreeSelect 
     allowClear 
     onChange={(value) => {onSearchText(value)}}
     placeholder={'请输入...'}
     treeNodeFilterProp="label"
     showSearch
     style={{width: '240px'}}
     onFocus={() => updateSearchData()}
     treeData={searchData}//  data.roots[0].children searchData
     treeDefaultExpandAll
>
// 查询脑图 node
  const onSearchText = (text) => {
    let node = mindContent.current.propsAPI.find(text);
    if(node){
      // 改变视图位置显示节点
      let posObj = node.graph.getPoint({x: document.body.clientWidth/2,y: document.body.clientHeight/2-60});
      let zoom = node.graph.getZoom();
      node.graph.translate( zoom * ( posObj.x - node.bbox.centerX ), zoom * ( posObj.y - node.bbox.centerY))
      // 高亮显示节点
      mindContent.current.propsAPI.currentPage.clearSelected()
      mindContent.current.propsAPI.currentPage.setSelected(node, text)
    }
  }

② ,切换数据之后居中显示

const moveToCanvasCenter = () => {
    let node = mindContent.current.propsAPI.find('0');
    if(node){
      let posObj = node.graph.getPoint({x: document.body.clientWidth/2,y: document.body.clientHeight/2-60});
      let zoom = node.graph.getZoom();
      node.graph.translate( zoom * ( posObj.x - node.bbox.centerX ), zoom * ( posObj.y - node.bbox.centerY ))
    }
  }

③, 禁止指定node被修改

重点说明, 因为是低版本,没有 visible 等参数使用, 且 clearSelected 无法生效。

所以想到一个办法: 在canvas外部构造div,在mouseDown node节点的时候,瞬间将div移至节点上方进行遮挡。

  const [coverVisible, setCoverVisible] = useState(false);
  const [coverWidth, setCoverWidth] = useState(100);
  const [coverHeight, setCoverHeight] = useState(100);
  const [coverLeft, setCoverLeft] = useState(100);
  const [coverTop, setCoverTop] = useState(100);
  
  const mindShouldUpdate = (obj: any) => {
    if(obj.item && obj.item.model.id == 0){
      setCoverVisible(true);
      setCoverWidth(obj.item.bbox.width);
      setCoverHeight(obj.item.bbox.height+5);
      let posObj = obj.item.graph.getClientPoint({x: obj.item.bbox.centerX-obj.item.bbox.width/2, y: obj.item.bbox.centerY-80});
      setCoverLeft( posObj.x);
      setCoverTop(  posObj.y);
    }else{
      setCoverVisible(false);
    }
  }
  
  <div className={styles.coverDiv} style={{
        width: coverWidth + 'px',
        height: coverHeight + 'px',
        left: coverLeft + 'px',
        top: coverTop + 'px',
        display: coverVisible ? 'block' : 'none'
  }}></div>
/**
.coverDiv{
  position: absolute;
  z-index: 9999;
}
*/

总结

不得不说 ggeditor 还是非常好用的,有了这个就可以自己制作头脑风暴,计划等图,简单好用。
缺点:api不好使,且没有明确文档,建议参考最上方给的两个网址使用,g6的一些api,ggeditor也有。
扩展:谁学了这个不想自己做一个头脑风暴的网站帮自己建立计划呢? 事半功倍有木有?但想想老板给的工资,还是算了。
划~~划~~划~~,摸~~摸~~摸~~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react hocks ggeditor 脑图开发(双向细目表), 实用技巧 的相关文章

随机推荐

  • Swift使用XMPPFramework做IM即时通信的Demo

    上一篇文章处理了文本中表情的替换 xff0c 现在来完成消息的发送功能吧 xff08 貌似前后并没有逻辑关系哈 xff09 首先为了测试 xff0c 我们需要下载spark工具 xff0c 它可以连接openfire搭建的后台来完成即时通信
  • P1591 阶乘数码

    题目描述 求n 中某个数码出现的次数 输入格式 第一行为 t t 10 xff0c 表示数据组数 接下来 t 行 xff0c 每行一个正整数n n 1000 和数码 a 输出格式 对于每组数据 xff0c 输出一个整数 xff0c 表示 n
  • nginx缓存命中率统计(转)

    转自 xff1a http www libertyvps com thread 275 1 1 html nginx提供了 upstream cache status这个变量来显示缓存的状态 xff0c 我们可以在配置中添加一个http头来
  • windows远程桌面连接到Linux服务器(ubuntu系统)、解决xrdp登录界面port问题、解决password failed

    一 xff1a 一般在windows系统安装ssh客户端远程连接Linux服务器 xff0c 可以很方便地传输文件 xff08 注意 xff1a 文件路径不能有小括号 xff0c 空格之类的 xff0c 不然会出现erro xff09 但如
  • linux之文件系统命令

    第一章 linux之帮助命令 第二章 linux命令行快捷键 第三章 linux之防火墙 第四章 linux之服务开机自启 第五章 linux之关机与重启 第六章 linux之环境变量 第七章 linux之目录操作命令 第八章 linux之
  • 解决linux底下cmake编译使用C++ 11标准库自带的thread报错问题

    本人在编写linux底下socket编程测试服务端时候 xff0c 发现使用std thread函数时候 xff0c cmake编译通过 xff0c make编译失败 xff0c CMakeLists txt如下 xff1a cmake m
  • unity UGUI 解决ScrollView加载大量Item导致卡顿的问题

    目录 1 引言2 问题分析3 代码部分4 使用举例4 1 场景搭建4 2 测试4 3 效果展示 5 Demo下载6 结束语 1 引言 我们在平常的开发中常常碰到列表类的数据处理 xff01 典型的像玩家列表这种可能数量非常庞大 xff0c
  • 使用 Amazon EC2 启动 Windows 虚拟机

    本教程将教授您如何使用 Amazon Elastic Compute Cloud EC2 来启动 配置和连接至 Windows 虚拟机 Amazon EC2 是用于在云中创建和运行虚拟机 xff08 我们将这些虚拟机称为 实例 xff09
  • linux ss 命令用法说明

    ss 是 Socket Statistics 的缩写 ss 命令可以用来获取 socket 统计信息 xff0c 它显示的内容和 netstat 类似 但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息 xff0c 而
  • 谷歌浏览器 跨域遇到的坑 cors 错误(亲测可行)

    浏览器版本 xff1a 一 现象 xff1a 解决方案 xff1a 方案一 xff1a xff08 已论证 xff09 步骤1 xff1a 谷歌浏览器 打开 chrome flags block insecure private netwo
  • 安装Visual Studio 2015时出现安装包丢失或损坏

    1 现象描述 在线安装vs时 xff0c 在线下载一直为0 xff0c 提示网络异常 xff0c 检查网络 xff1b 实际网络是能联网的 离线安装ISO xff0c 安装1分钟左右 提示安装包损坏或丢失 xff0c 选择从inter下载或
  • 数据库实验-数据查询练习

    用SQL语句完成以下查询 1 查询所在系为 CS 的学生学号和姓名 xff1b select sno sname from student where sdept 61 39 CS 39 2 查询选修了3号课程的学生学号 xff1b sel
  • web前端播放视频基础(多种格式,mp4, ogg, flv)(普通项目和vue项目)

    前端播放视频 满足一般播放条件 话不多说 先上代码 以下包含我能做出来可以做出来播放的视频格式 测试ok 可能还有ogg和wmv的格式可以播放 但我没测试通过 所以不展示 span class token keyword if span s
  • javascript中正则匹配多个条件, 常用正则匹配, 正则详解

    javascript中正则匹配多个条件 常用正则匹配 正则表达式常用方法实现其他的常用正则匹配详解 注意 本篇文章是根据在下日常编码过程中逐渐丰富的 越往后看 收获越丰富 收藏起来以后随时回顾 准备工作 1 汉字和unicode码的在线转换
  • antd react ProTable 基本使用

    antd react pro系列 ProTable 基本使用 一 安装二 常用字段 antd 全称 Ant Design 是目前来说运用最广泛的 react 的 ui 框架 下文就用略写 antd 代替了 pro系列不做过多解释 毕竟ui框
  • canvas插件 fabric.js 使用

    fabric js使用 fabric js 是 常用的 canvas 插件1 在项目中使用2 特殊用法 基本设置 画板数据的导入导出 遮罩 Pattern 引用官网案例 多个对象合并 并设置为 fabric 背景 适用于变色和更多场景 把
  • 前端 百度地图 javascript api 在线地图, 离线地图

    前端 百度地图 javascript api 在线地图 离线地图 在线地图登录百度api获取key注册为个人开发者后 创建应用 离线地图 瓦片地图 下载离线瓦片地图二 下载api js 一些常用api难找见的api 在线地图 在线地图 百度
  • 基于 jquery imagesloaded masonry 实现的瀑布流图片展示

    基于 jquery imagesloaded masonry 实现的瀑布流图片展示 基于 jquery imagesloaded masonry 实现的瀑布流图片展示简述 xff0c 版本 xff0c 及插件案例htmlcssjs 基于 j
  • 微信小程序开发双重for循环, wx: if else 语法

    微信小程序开发 双重for循环 多重for循环 重点在于 wx for item 61 34 problemItem 34 和 wx for index 61 34 idx 34 确定循环的 item 和index 理论上可以实现无上线条循
  • react hocks ggeditor 脑图开发(双向细目表), 实用技巧

    ggeditor脑图开发 目录 配置说明api介绍 xff0c 引入插件 xff0c 获取api xff08 withPropsAPI xff09 xff0c 获取node api xff0c 常用api汇总 xff0c 绑定事件功能实现