Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

打印 上一主题 下一主题

主题 1766|帖子 1766|积分 5298

本文将详细介绍怎样在 Vue3 项目中集成 mxGraph 可视化库,并通过 WebSocket 实现画布元素的及时更新。适合有 Vue 基础的前端开发者学习参考。

一、技术栈准备



  • Vue3:采用 Composition API 开发
  • mxGraph:JavaScript 流程图库(版本 2.1.0)
  • WebSocket:实实际时数据通讯
  • TypeScript:可选(示例代码使用 TS)
二、项目初始化

1、创建 Vue3 项目:
  1. npm create vue@latest mxgraph-websocket-demo
  2. cd mxgraph-websocket-demo
  3. npm install mxgraph
复制代码
2、引入 mxGraph 样式:
  1. // main.ts
  2. import 'mxgraph/javascript/mxClient'
  3. import 'mxgraph/styles/mxgraph.css'
复制代码
三、核心组件开发

1. 画布组件设计

  1. // components/GraphCanvas.vue
  2. <template>
  3.   <div ref="graphContainer" class="mxgraph" style="height: 600px;"></div>
  4. </template>
  5. <script setup lang="ts">
  6. import { ref, onMounted, onUnmounted } from 'vue'
  7. import { mxGraph, mxCell, mxConstants } from 'mxgraph'
  8. const graphContainer = ref<HTMLDivElement | null>(null)
  9. let graph: mxGraph | null = null
  10. onMounted(() => {
  11.   if (!graphContainer.value) return
  12.   // 初始化画布
  13.   graph = new mxGraph(graphContainer.value)
  14.   const parent = graph.getDefaultParent()
  15.   // 添加初始节点
  16.   graph.getModel().beginUpdate()
  17.   try {
  18.     const cell1 = graph.insertVertex(parent, null, 'Node 1', 20, 20, 80, 30)
  19.     const cell2 = graph.insertVertex(parent, null, 'Node 2', 200, 20, 80, 30)
  20.     graph.insertEdge(parent, null, '', cell1, cell2)
  21.   } finally {
  22.     graph.getModel().endUpdate()
  23.   }
  24. })
  25. onUnmounted(() => {
  26.   if (graph) {
  27.     graph.dispose()
  28.   }
  29. })
  30. </script>
  31. <style scoped>
  32. .mxgraph {
  33.   border: 1px solid #ccc;
  34.   margin: 20px;
  35. }
  36. </style>
复制代码
 
四、WebSocket 集成

1. 通讯模块封装

  1. // services/ws.ts
  2. import { reactive, onMounted, onUnmounted } from 'vue'
  3. interface WsState {
  4.   socket: WebSocket | null
  5.   messages: string[]
  6.   connected: boolean
  7. }
  8. export const useWebSocket = () => {
  9.   const state = reactive<WsState>({
  10.     socket: null,
  11.     messages: [],
  12.     connected: false
  13.   })
  14.   const connect = (url: string) => {
  15.     if (state.socket) return
  16.     state.socket = new WebSocket(url)
  17.     state.socket.onopen = () => {
  18.       state.connected = true
  19.     }
  20.     state.socket.onmessage = (event) => {
  21.       state.messages.push(event.data)
  22.       // 解析消息并更新画布
  23.       handleMessage(event.data)
  24.     }
  25.     state.socket.onclose = () => {
  26.       state.connected = false
  27.       setTimeout(() => connect(url), 3000)
  28.     }
  29.   }
  30.   const handleMessage = (message: string) => {
  31.     const data = JSON.parse(message)
  32.     // 调用画布更新方法
  33.     updateGraph(data)
  34.   }
  35.   return {
  36.     connect,
  37.     state
  38.   }
  39. }
复制代码
五、及时更新逻辑

1. 数据处理与视图更新

  1. // components/GraphCanvas.vue
  2. <script setup lang="ts">
  3. // ... 省略之前的代码
  4. // 引入WebSocket服务
  5. import { useWebSocket } from '@/services/ws'
  6. const { connect } = useWebSocket()
  7. // 初始化WebSocket连接
  8. onMounted(() => {
  9.   connect('ws://localhost:8080/ws')
  10. })
  11. // 新增节点方法
  12. const addVertex = (x: number, y: number, label: string) => {
  13.   if (!graph) return
  14.   graph.getModel().beginUpdate()
  15.   try {
  16.     graph.insertVertex(
  17.       graph.getDefaultParent(),
  18.       null,
  19.       label,
  20.       x,
  21.       y,
  22.       80,
  23.       30,
  24.       mxConstants.STYLE_SHAPE + '=ellipse;'
  25.     )
  26.   } finally {
  27.     graph.getModel().endUpdate()
  28.   }
  29. }
  30. // 接收WebSocket数据更新
  31. const updateGraph = (data: any) => {
  32.   if (data.type === 'add-node') {
  33.     addVertex(data.x, data.y, data.label)
  34.   }
  35. }
  36. </script>
复制代码
六、注意事项


  • 性能优化

    • 使用graph.getModel().beginUpdate()和endUpdate()包裹批量操作
    • 对频繁更新的场景添加防抖处理

  • 内存管理

    • 在组件卸载时调用graph.dispose()开释资源
    • 正确关闭 WebSocket 连接

  • 安全性

    • 对 WebSocket 消息进行格式校验
    • 敏感操作添加身份验证

七、总结

本文通过完整的代码示例展示了 Vue3 + mxGraph + WebSocket 的组合应用,实现了动态流程图的及时更新功能。关键点包括:

  • mxGraph 的 Vue3 集成方法
  • WebSocket 的状态管理与重连机制
  • 数据驱动的画布更新逻辑
通过这种技术组合,我们可以构建出具有及时交互本领的可视化应用,实用于流程监控、在线协作等场景。后续可以进一步扩展节点样式、布局算法和交互变乱等功能。
 

 
 
 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表