当前位置: 首页 > news >正文

Vue3使用AntvG6写拓扑图,可添加修改删除节点和边

npm安装antv/g6

npm install @antv/g6 --save

上代码

<template><div id="tpt1" ref="container" style="width: 100%;height: 100%;"></div>
</template><script setup>import { Renderer as SVGRenderer } from '@antv/g-svg';//通过svg方式呈现import { Graph,iconfont } from '@antv/g6';import { onMounted, onUnmounted, ref,nextTick,computed } from 'vue';const container = ref();const nodes = ref([{ id: '1', style: { x: 550, y: 100 },data:{id:'1',name:"wifi路由器",type:"路由器"} }//数据格式])const edges = ref([{ id:'1-3-g1',source: '1', target: '3',data:{id:1,name:"线路1",status:0,outRate:"80MB/s",inRate:"50MB/s",scoureName:"url",scoureType:"",scoureUrl:"",targetName:"http",targetType:"",targetUrl:"",watchDevice:"",watchUrl:""} }//数据格式])let graph:any = nullonMounted(() => {updateChart();})onUnmounted(() => {graph && graph.clear();});//获取所有节点const getNodeData = () => {return graph.getNodeData()}//获取所有边const getEdgeData = () => {return graph.getEdgeData()}//获取缩放比例const getZoom = () => {return graph.getZoom();}const updateChart = () => {const style = document.createElement('style');style.innerHTML = `@import url(${iconfont.css});`;document.head.appendChild(style);graph = new Graph({container: container.value,data: {nodes: nodes.value,edges: edges.value,},edge: {// type:"extra-label-edge",style: {//线条的样式cursor: 'pointer',lineWidth: 1,labelText: (d:any) => {// 改变边上的第一行第二行颜色nextTick(()=>{let parentElement = document.getElementById(d.id)let tspanList = parentElement.getElementsByTagName("tspan")setTimeout(()=>{if(tspanList.length>=2){tspanList[0].setAttribute("fill","#81f4f9")tspanList[1].setAttribute("fill","#eca13c")}})})return props.isEdit||(d.data.outRate==''&&d.data.inRate=='')?'':`⬆${d.data.outRate}\n⬇${d.data.inRate}`;},data:(d)=>{return d.data},endArrow: props.isEdit?true:false,endArrowType: (d) => d.id.split('-')[0],increasedLineWidthForHitTesting:10,stroke: '#83d6dc',labelAutoRotate:true,//是否旋转与边一致labelFill: '#fff',labelFontSize: 11,labelPadding:[3,7],zIndex:2},},transforms: [{type:"process-parallel-edges",mode:"bundle",distance: 50}],node: {type: 'image',style:{padding:[10,10],size: [60,60],labelText: (d:any) => {return d.data.name;},src: (d)=>{//通过类型自定义节点图片let imgArr:any = {"交换机":"tpt_jhj.png","路由器":"tpt_lyq.png","安全设备":"tpt_fhq.png","其他设备":"tpt_qt.png",}return (d.data.type?getImageUrl(imgArr[d.data.type]):getImageUrl('tpt_qt.png')) || getImageUrl('tpt_qt.png')},data:(d)=>{return d.data},labelPosition: 'bottom',labelFill: '#fff',labelFontSize: 13,labelBackground: false,//背景颜色labelBackgroundFill: 'linear-gradient(#e66465, #9198e5)',labelBackgroundStroke: '#9ec9ff',labelBackgroundRadius: 2,labelFontWeight: 600,labelPadding:[3,10],zIndex:3,labelOffsetY:8,badge: false, // 是否显示徽标badges: [{ text: 'x', placement: 'right-top',padding:[2,5] },],badgePalette: ['red'], // 徽标的背景色板badgeFontSize: 10, // 徽标字体大小}},behaviors: [{type:'zoom-canvas'//缩放},{type: 'drag-canvas',key: 'drag-canvas-1',},{type:"drag-element",key: 'drag-element-1',enableAnimation:false,shadow:false//拖动样式},{type: 'create-edge',key:"create-edge-1",trigger: 'click',//dragonCreate: (edge) => {//创建线的样式const { style, ...rest } = edge;return {...rest,data:{name:"",status:0,scoureName:"",scoureType:"",scoureUrl:"",targetName:"",targetType:"",targetUrl:"",watchDevice:"",watchUrl:"",inRate:"",outRate:"",},style: {...style,stroke: 'red',lineWidth: 2,endArrow: true,},};},},],renderer: () => new SVGRenderer(),});graph.render();//鼠标右键点击节点编辑graph.on('node:contextmenu', (e) => {//添加编辑设备不为0是修改form.value = e.target.config.style.datasubmitNode();});}//添加设备按钮const addNode = () => {form.value.id = 0submitNode();}//添加修改节点const submitNode = () => {if(form.value.id == 0){//添加nodes.value = graph.getNodeData();graph.addData({nodes:[{id: nodes.value.length>0?`${graph.getNodeData().length+1}`:"1",style:{ x: container.value.clientWidth/2, y: 30 },data:{id:nodes.value.length>0?`${graph.getNodeData().length+1}`:"1",name:form.value.name,type:form.value.type}}]})}else{graph.updateNodeData([{id:form.value.id,data:form.value}])}graph.render();}
</script>

运行结果

不断更新

http://www.xdnf.cn/news/20755.html

相关文章:

  • 统计字符串每个字符出现频率
  • <sql>、<resultMap>、<where>、<foreach>、<trim>、<set>等标签的作用和用法
  • CCS编译器无法导入工程文件,检查原因是版本编译器编译问题
  • Oracle 19c部署之RMP一键安装初始化(五)
  • [TriCore][TC3XX][用户手册] - 16.中断控制器 - IR
  • MATLAB 控制系统设计与仿真 - 35
  • 提示词工程学习指南(专家级)- 上集
  • OpenSPG/KAG V0.7发布,多方面优化提升,事实推理效果领先且构建成本降至11%
  • 2025 第一届ynuctf wp crypto-misc
  • 【sharding-jdbc配置以及例子】
  • IPD需求变更管理怎么做?4步实现需求版本有效控制
  • Node.js 异步调用淘宝API实战:构建高吞吐商品详情数据采集方案
  • MCP协议 —— AI世界的“USB-C接口”
  • PMP考试费能报销吗?报销流程是什么?
  • 软件项目验收报告模板
  • csdn封面图快速制作【独一无二的图】
  • Pyside6联合QML实现消息弹窗提示
  • 通过 Tailwind CSS 自定义样式 实现深色模式切换
  • Brain Stimulation | 状态依赖性刺激中的大脑网络动态:基于隐马尔可夫模型的EEG-TMS联合分析
  • 多态:面向对象编程的重要特性
  • CSS伪类
  • CSS 文件格式
  • 期货交易躲过AI捕杀—期货反向跟单策略
  • 基于PySide6与pyCATIA的圆柱体特征生成工具开发实战——NX建模之圆柱命令的参考与移植
  • 守护进程编程、GDB调试以及外网连接树莓派
  • 【数据结构】深入理解:完全二叉树中叶子节点与分支节点的数量关系推导
  • 每天学一个 Linux 命令(21):tree
  • Harmony5.0 设置应用全屏模式,隐藏导航栏和状态栏
  • 我的创作纪念日
  • HCIP-H12-821 核心知识梳理 (3)