JTopo踩坑记 -- React项目中使用JTopo

article/2025/8/14 19:27:42

JTopo踩坑记 – React项目中使用JTopo

JTopo-in-node & JTopo

最近实习公司一个项目需要绘制电网的拓扑图,大致要求的效果如下:
在这里插入图片描述
首先想到的是Echarts和d3,因为这个项目其他图表都是使用的Echarts, 但是在Echarts的官方示例以及 Gallery中并没有找到类似的示例,并且Echarts的自动布局大多为环形布局,不符合项目需求。所以只能寻找其他的node包。然后就找到了JTopo,但是在官网上只有js文件,之后在npm官网找到了node版本的JTopo。需要说明的是,目前所有es6版本的JTopo相关的包都是由JTopo爱好者贡献的。一开始我只关注了JTopo这一个包, 但是在实际的使用中我发现了很多问题,并且很多JTopo官网有的功能这个包没有实现,这也导致我最终放弃了这个包, 而选择了JTopo-in-node。npm安装指令:

npm i jtopo-in-node

JTopo

JTopo这个包只是封装了一些基本的功能,比如创建node和link,虽然作者说的api和JTopo官网的类似,但是还是有一些差别的,比如官网给一个scene添加node或者link使用scene.add(node),但是在这个包中需要使用scene.name.add(node)。还有很多功能没有实现比如node的alarm以及tip只能在节点顶部绘制,无法显示link的名称;甚至还有一些错误,比如作者Github中给的vue写的示例,node的Tip显示会出错。在使用中我发现当canvas的大小超出了页面的高度,将页面滑动的时候会出现鼠标无法选择节点的情况,只有回到页面加载成功时的位置才能正常使用。

一开始我使用这个包进行开发,并且画出了大概的图在这里插入图片描述
但是新的需求来了,需要平移和缩放以及查找节点。我发现没有继续使用这个包无法实现这个包。因为这个图上需要显示实时的数据,所以每一次有新的数据都会导致页面重绘,并且由于这个包没有提供自动布局,只能自己计算位置,所以新的需求没有办法实现,之后我就找到了jtopo-in-node。

jtopo-in-node

jtopo-in-node的api和JTopo官网几乎一样,可以参考官网的api教程,目前我只使用React实现了官网的一个实例:
在这里插入图片描述
代码:

import React, { PureComponent } from 'react'
import JTopo from 'jtopo-in-node';
import {Row, Col, Card} from 'antd';class DeviceGraph extends React.Component{state = {canvasWidth: '300',position: [],allSensors: []};componentDidMount() {var canvas = this.refs.test;canvas.width = window.innerWidth * 0.95;this.setState({canvasWidth: window.innerWidth * 0.95});}node = (scene, x, y, img) => {var node = new JTopo.Node();node.setImage('http://www.jtopo.com/demo/img/statistics/' + img, true);node.setLocation(x, y);node.dragable = false;node.fontColor = '0,0,0';scene.add(node);return node;};linkNode = (scene,nodeA, nodeZ, f) => {var link;if(f){link = new JTopo.FoldLink(nodeA, nodeZ, "test");}else{link = new JTopo.Link(nodeA, nodeZ);}link.direction = 'vertical';scene.add(link);return link;};hostLink = (scene, nodeA, nodeZ) => {var link = new JTopo.FlexionalLink(nodeA, nodeZ);link.shadow = false;link.offsetGap = 44;scene.add(link);return link;};render(){console.log('JTopo', JTopo);// canvas元素存在之后再进行操作if(this.refs.test){var stage = new JTopo.Stage(this.refs.test);stage.eagleEye.visible = null;stage.wheelZoom = 0.95;var scene = new JTopo.Scene(stage);scene.background = 'http://www.jtopo.com/demo/img/bg.jpg';var s1 = this.node(scene,305, 43, 'server.png');s1.alarm = '2 W';var s2 = this.node(scene,365, 43, 'server.png');var s3 = this.node(scene,425, 43, 'server.png');var g1 = this.node(scene,366, 125, 'gather.png');this.linkNode(scene,s1, g1, true);this.linkNode(scene,s2, g1, true);this.linkNode(scene,s3, g1, true);var w1 = this.node(scene,324, 167, 'wanjet.png');this.linkNode(scene,g1, w1);var c1 = this.node(scene,364, 214, 'center.png');this.linkNode(scene,w1, c1);var cloud = this.node(scene,344, 259, 'cloud.png');this.linkNode(scene,c1, cloud);var c2 = this.node(scene,364, 328, 'center.png');this.linkNode(scene,cloud, c2);var w2 = this.node(scene,324, 377, 'wanjet.png');this.linkNode(scene,c2, w2);var g2 = this.node(scene,366, 411, 'gather.png');this.linkNode(scene,w2, g2);var h1 = this.node(scene,218, 520, 'host.png');h1.alarm = '';this.hostLink(scene,g2, h1);var h2 = this.node(scene,292, 520, 'host.png');this.hostLink(scene,g2, h2);var h3 = this.node(scene,366, 520, 'host.png');h3.alarm = '二级告警';h3.text = 'h3';this.hostLink(scene,g2, h3);var h4 = this.node(scene,447, 520, 'host.png');this.hostLink(scene,g2, h4);var h5 = this.node(scene,515, 520, 'host.png');h5.alarm = '1M';this.hostLink(scene,g2, h5);stage.setCenter(515, 520)setInterval(function(){if(h3.alarm == '二级告警'){h3.alarm = null;h3.text = 'h3'+ Math.random()}else{h3.alarm = '二级告警'}}, 600);}return(<Row><Col className="gutter-row" xs={24} sm={24} md={24} lg={24} xl={24} ><Card  style={{textAlign: "center" ,width:"100%", height: '650px', marginBottom: '20px'}}><canvas ref="test" width= {'300px'}  height={'600px'} /></Card></Col></Row>)}}export default DeviceGraph;

没有安装antd的同学可以使用将render中的return换成

<div><canvas ref="test" width= {'300px'}  height={'600px'} />
</div>

在控制台输出JTopo可以看到几乎实现了JTopo官网的所有功能:
控制台输出JTopo
目前还没有用到项目当中,等到使用了之后再总结一下使用经验。

最后感谢JTopo原作者以及编写es6版本的爱好者,欢迎大家加入JTopo交流群:171820448 。


http://chatgpt.dhexx.cn/article/Ql9VKUjD.shtml

相关文章

jtopo的项目实战(七)

话接上回&#xff0c;继续实现jtopo本身不具有的一些功能&#xff0c;有讲的不对的地方&#xff0c;欢迎大家在评论区留言提出&#xff0c;博主基本每天在线&#xff0c;看到都会及时回复的&#xff0c;我们一起进步&#xff0c;奥利给&#xff0c;还有&#xff0c;码字不易&am…

关于vue3.0项目引入jtopo出现的各种问题汇总

jtopo官网demo网址&#xff1a;http://www.jtopo.com/demo.html 最近的项目需要用到jtopo&#xff0c;关于jtopo的引入&#xff0c;之前自己也都尝试过&#xff0c;没想到这次引入会出现这么多问题&#xff0c;所以大概总结一下 1、借用同事以前的经验来引入 npm install jto…

JTopo 框架教程之一:初始JTopo 框架

JTopo 是什么&#xff1f; JTopo&#xff08;Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。jTopo关注于数据的图形展示&#xff0c;它是面向开发人员的&#xff0c;需要进行二次开发。使用jTopo很简单&#xff0c;可以快速创建一…

jtopo的项目实战(一)

前言 初识jtopo是因为项目中需要一个能够动态绘制网络拓扑图的插件&#xff0c;不但能画出基本的网络拓扑结构&#xff0c;还要能够标识出网络设备的类型以及端口设置&#xff0c;甚至是网络连线的流量信息等&#xff0c;基于这个需求查找了很多资料&#xff0c;初步选中了几款…

jtopo的项目实战(二)

话接上回&#xff0c;继续实现jtopo本身不具有的一些功能&#xff0c;有讲的不对的地方&#xff0c;欢迎大家留言提出&#xff0c;我们一起进步&#xff0c;奥利给&#xff0c;还有&#xff0c;码字不易&#xff0c;如果觉得博主写的不错的欢迎打赏哈&#xff01; 2.美化节点之…

vue、jtopo绘制鱼骨图

效果如下图所示&#xff1a; 一、文件目录结构&#xff1a; 二、绘制png的鱼头、鱼尾图片 fish_head.png&#xff1a; fish_tail.png&#xff1a; 三、下载js文件 jquery、jtopo请到官网下载。 四、编写鱼骨图核心文件&#xff1a;MakFishBone.js let MakFishBo…

通过JTopo.js在网页绘制网络拓扑图

项目中遇到要在网页中绘制网络拓扑图的需求&#xff0c;要求节点具备点击、拖拽、缩放等交互功能&#xff0c;并且可以显示/隐藏详细信息&#xff0c;数据是设备实时上报来的。 综上&#xff0c;用画拓扑图的工具画一张固定的图片偷懒显然是不行的&#xff0c;最好是找到一个封…

JTopo添加动态连线

效果如下 先在 JTopo 的 link 原型上定义一个方法 window.requestAnimationFrame window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame JTopo.Link.prototype.drawanimepic functi…

JTopo + Vue 实现自定义拖拽流程图

JTopo Vue 实现自定义拖拽流程图 进入体验效果 进入github 市场上做流程图的插件比较多&#xff0c;这里介绍一种基于canvas编写的js插件&#xff0c;结合vue框架做出精美的流程图 首先搭建vue框架&#xff0c;这里就不做介绍&#xff0c;由于jtopo官方demo里用到了jquery&am…

jtopo连线绘制脉冲动画效果

随着需求的日益精细化&#xff0c;人们越来越多的关注到了画面的美观&#xff0c;单纯的节点间连线已经不满足人们的审美观念了&#xff0c;那么能不能让节点间的连线动起来呢&#xff1f;答案是可以的&#xff0c;老规矩&#xff0c;先上图&#xff0c;再说怎么实现。 同样&am…

jTopo入门 简单实现拓扑图

最近项目中需要绘制拓扑图&#xff0c;于是研究了下绘制拓扑图的组件&#xff0c;jtopo是一款比较简单易上手的开发工具包&#xff0c;分享给大家。 jtopo特点 1、完全基于HTML5 Canvas开发&#xff0c;API平易近人、几乎简单到了极致。 2、不依赖任何其他库、执行仅需一个Ca…

jtopo 实现一键布局

最近很忙、也很懒&#xff0c;一堆烦心事&#xff0c;jtopo后面不准备再深究了&#xff0c;本身东西也不多&#xff0c;做出的新功能&#xff0c;新特效也都写到博客中来了&#xff0c;今天给大家分享最近研究的一个新技能——jtopo一键布局&#xff0c;写给大家、也写给自己。…

jtopo简单实例

原贴地址 http://cn-arthurs.iteye.com/blog/2009345 说明: jtopo是一个基于canvas的js拓扑图形组件.比canvasexpress容易多了. 可以方便地加点,加连线,加鼠标事件,拖曳. 号称跨浏览器,不过实际上不支持ie678,加上excanvas.js也没用,除非像canvasexpress那样使用chrome插件. …

Vue — jTopo

近期在Vue项目中使用jTopo来制作集群节点拓扑图&#xff0c;官网http://www.jtopo.com/ 使用vue-cli搭建的模块化开发项目&#xff0c;使用第三方库最好的方式就是通过npm install xxx安装&#xff0c;然后在项目 里import xxx来使用&#xff1b;但是在JTopo官网上并没有发现有…

【Vue引入JTopo及所遇到的问题】

Vue引入JTopo及所遇到的问题 前言一、方案选型二、使用步骤三、总结 前言 项目过程中总是会遇到稀奇古怪的需求&#xff0c;这不&#xff0c;咱老大又让我画一个系统拓扑图放在首页&#xff0c;要求部分数据需从后端获取&#xff0c;动态展示在页面上。对于一个后端人猿来说&a…

Vue+JTopo(一)

1.下载js jtopo 更新下载 (不知道为什么网站被封禁了……在这提供下我现在用的 jtopo-1.4.4_trial-esm-min.js) 链接&#xff1a;https://pan.baidu.com/s/18V1HKwAuxzWM19RD4axGOg 提取码&#xff1a;0304 2.引用 文件放在public/js文件夹下&#xff0c;在index.hml内引用。…

jTopo(一)

jTopo(一) 一、jTopo是什么 jTopo&#xff08;Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。 jTopo关注于数据的图形展示&#xff0c;它是面向开发人员的&#xff0c;需要进行二次开发。 使用jTopo很简单&#xff0c;可以快速…

windows10下安装MSYS2+MinGW64

1.下载msys2&#xff0c;官方地址&#xff1a;http://www.msys2.org/&#xff0c;这里选择64位的安装器 2.安装完成之后&#xff0c;先别启动msys2&#xff0c;在 安装根目录/etc/pacman.d/ 下找到mirrorlist.mingw32、mirrorlist.mingw64和mirrorlist.msys并进行修改。 mirr…

Win10 下安装 MSYS2

什么是 MSYS2 MSYS2 &#xff08;Minimal SYStem 2&#xff09; 是一个MSYS的独立改写版本&#xff0c;主要用于 shell 命令行开发环境。同时它也是一个在Cygwin &#xff08;POSIX 兼容性层&#xff09; 和 MinGW-w64&#xff08;从"MinGW-生成"&#xff09;基础上…

【msys2】使用msys2下载工具的旧版本

背景 苯人在计组实验中使用了msys2来安装verilator工具&#xff0c;结果最新版本的verilator有bug&#xff0c;几经探索找到了利用msys2下载旧版本工具的方法&#xff08;还可以将现有工具更新为旧版本&#xff09; 步骤 现以安装旧版本的verilator为例讲解方法。 这是msys…