Vue 整合 Vue Flow:从零构建交互式流程图

vue3流程图组件vue flow使用 vue3流程图组件、vue flow、typescript 阅读详情
AI摘要

本文介绍如何在Vue中整合Vue Flow构建交互式流程图。涵盖环境准备、自定义节点、操作实现(如拖拽、连线、删除)、JSON管理等内容,还给出性能优化建议和常见问题解决办法,适合不同水平开发者,可用于工作流管理、数据可视化等场景。

引言

        Vue Flow 是一个基于 Vue 的流程图库,结合 Vue.js 的组件化优势,可用于创建交互式、可视化的流程图。本文将逐步引导你整合 Vue Flow,涵盖从环境配置到自定义节点、拖拽、连线、删除、JSON 管理和优化,适合初学者和高级开发者。

目的

 本文旨在提供一个全面的指南,帮助开发者:

  • 理解 Vue Flow 的核心功能和集成流程。
  • 实现交互式流程图,包括拖拽、连线和节点管理。
  • 掌握数据持久化(保存和导入 JSON),提升项目实用性。
  • 优化性能并解决常见问题,确保生产环境稳定。

适用场景

  • 工作流管理:设计审批或任务流程。
  • 数据可视化:展示组织结构或网络拓扑。
  • 工业自动化:模拟设备连接和生产流程。
  • 教育工具:可视化算法或逻辑步骤。
  • 说明插图:绘制一个工业流程图,包含 “设备1”, “工序1”, “设备2” 节点和连接线。

环境准备

  • 项目初始化:使用 Vue 3 + Vite 创建项目。

  • 依赖安装:

npm install @vue-flow/core @vue-flow/background @vue-flow/controls @vue-flow/minimap ant-design-vue

@vue-flow/core:核心库。
@vue-flow/background:背景网格。
@vue-flow/controls:交互控制。
@vue-flow/minimap:画布概览。
ant-design-vue:用于按钮样式。
在这里插入图片描述

基础组件 (index.vue)

创建 src/components/FlowChart.vue 作为流程图容器。

<template>
  <div class="flow-container">
    <div class="layout">
      <!-- 左侧可选项区域 -->
      <div class="sidebar">
        <h3>可拖拽节点</h3>
        <div
          v-for="option in nodeOptions"
          :key="option.type"
          class="draggable-node"
          :data-type="option.type"
          draggable="true"
          @dragstart="onDragStart"
        >
          <div class="node-label">{
  
  { option.label }}</div>
          <div class="node-preview-wrapper">
            <div :class="['inner-shape', option.shapeClass]">
              <div class="label">{
  
  { option.label }}</div>
            </div>
          </div>
        </div>
      </div>

      <!-- 右侧 Vue Flow 画布 -->
      <div class="flow-area">
        <div class="toolbar">
          <a-button type="primary" @click="addRandomNode">添加随机节点</a-button>
<!--          <a-button type="danger" @click="deleteSelected">删除选中节点</a-button>-->
          <a-button type="default" @click="exportJson">导出 JSON</a-button>
          <a-button type="default" @click="saveExportJson">保存流程图</a-button>
        </div>

        <VueFlow
          v-model:nodes="nodes"
          v-model:edges="edges"
          :node-types="nodeTypes"
          :default-edge-options="{
            type: 'smoothstep',
            animated: true,
            markerEnd: { type: 'arrowclosed', color: '#ff0000' },
            style: { stroke: '#ff0000', strokeWidth: 2, strokeDasharray: 'none' },
          }"
          :connection-line-style="{ stroke: '#ff0000', strokeWidth: 2, strokeDasharray: 'none' }"
          :fit-view-on-init="true"
          :connectable="true"
          @drop="onDrop"
          @dragover.prevent
          @connect="onConnect"
          @node-click="onNodeClick"
          @node-drag-start="onNodeDragStart"
          @node-drag-stop="onNodeDragStop"
          @pane-click="onPaneClick"
        >
          <Background variant="dots" :gap="20" />
          <Controls />
          <MiniMap />
        </VueFlow>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import {ref, markRaw, onMounted} from 'vue'
import { VueFlow, useVueFlow } from '@vue-flow/core'
import type { NodeTypesObject } from '@vue-flow/core'
import { Background } from '@vue-flow/background'
import { Controls } from '@vue-flow/controls'
import { MiniMap } from '@vue-flow/minimap'
import { message } from 'ant-design-vue'
import DiamondNode from './DiamondNode.vue'
import CircleNode from './CircleNode.vue'
import ImageNode from './ImageNode.vue'
import DeviceNode from './DeviceNode.vue'
import UserNode from './UserNode.vue'
import RoundedRectangleNode from './RoundedRectangleNode.vue'
import { editingNodeId } from './store'
import '@vue-flow/core/dist/style.css'
import '@vue-flow/core/dist/theme-default.css'
import '../style/node-styles.css'

const nodes = ref([])
const edges = ref<any>([])

const nodeTypes: NodeTypesObject = {
  diamond: markRaw(DiamondNode),
  circle: markRaw(CircleNode),
  image: markRaw(ImageNode),
  user: markRaw(UserNode),
  device: markRaw(DeviceNode),
  roundedRectangle: markRaw(RoundedRectangleNode),
}

const { addNodes, getNodes, deleteElements,removeNodes } = useVueFlow()

const nodeOptions = r
vue3+ts 绘制流程图 vueflow 附代码及效果图 已完成渲染流程图,自定义模板内容(上下分级),自定义样式,新增节点addRandomNode,点击修改节点nodeClickHandler(从父组件传值)官网:https://vueflow.dev/guide/node.html#node-template 文档比较复杂,很多想找的方法没法一下就找到需要注意我装了三个,如果npm安装报错可以试试yarn add 阅读详情

相关推荐

Element UI整合指南:用Vue-super-flow打造树形菜单+流程图双联动效果

本文详细介绍了如何将Element UI与Vue-super-flow深度整合,打造企业级流程图设计器。通过树形菜单与流程图的双向绑定、拖拽交互实现及高级功能开发,帮助开发者快速构建功能完善的拖拽流程图应用,提升企业应用开发效率。

w3x4y的博客 355

基于 vue-flow 实现可视化流程图

vue-flow 是一个基于 Vue.js 的强大且灵活的可视化流程图库,它允许开发者轻松创建交互式的流程图、工作流图、节点图等。

小龙在线 3281

Vue3流程图实战:基于Vue Flow构建可交互的业务流程编辑器

本文详细介绍了如何基于Vue Flow在Vue3项目中构建功能强大的可交互业务流程编辑器。通过实战演示,从环境搭建、核心概念理解到实现动态交互与深度定制,帮助开发者快速掌握利用Vue Flow这一专业流程图组件库,高效开发低代码平台或后台管理系统中的图形化编排功能。

cola5的博客 340

Vue Flow实战:打造动态可交互的企业级工作流编辑器

本文详细介绍了如何利用Vue Flow构建动态可交互的企业级工作流编辑器。通过核心概念解析、快速上手教程、自定义节点开发、复杂事件处理及企业级功能扩展,展示了Vue Flow作为高度灵活的可视化图形引擎,如何赋能B端项目,实现高效、深度定制的工作流设计与开发。

weixin_29011239的博客 366

别再手动画图了!用Vue Flow + Element Plus快速搭建可配置的业务流程图后台

本文详细介绍了如何利用Vue Flow和Element Plus快速构建企业级流程图配置平台,提升后台管理系统的业务流程可视化效率。通过Vue 3生态的技术整合,实现节点拖拽、属性配置和状态管理等核心功能,大幅减少手动绘图时间,适用于各类业务场景。

weixin_29002209的博客 236

别再手撸流程图了!用Vue-Super-Flow + Element-UI快速搭建审批流后台(附完整代码)

本文介绍如何利用Vue-Super-Flow与Element-UI快速搭建企业级审批流后台,解决传统手工开发流程图的高成本、低维护性问题。通过完整代码示例,展示审批节点定制、条件分支实现等核心功能,帮助开发者提升开发效率,构建专业级审批系统。

weixin_30908941的博客 316

YOLO详解

本文参考知乎 https://zhuanlan.zhihu.com/p/25236464 1. YOLO的创新点 YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。 从网络设计上,YOLO与two steps的目标检测方法如RCNN、Fast RCNN和Faster RCNN的区别如下: YOLO训练和检测均是在一个单独网...

UnknownPlayer的博客 9949

LaTex的下载与安装(2024小白+windows系统)

本文主要介绍了Latex的下载与安装,还包括安装过程中遇到的小问题的解决。

m0_53096519的博客 2万+

避坑指南:Qgis等时圈分析中ORS插件Key申请与参数设置的常见错误

本文详细解析了QGIS等时圈分析中ORS插件从API密钥申请到参数优化的全流程避坑指南。针对密钥激活、出行模式选择、时空参数设置等七个高频故障点,提供了实用的调试方案和优化技巧,帮助用户高效完成空间可达性分析。

weixin_42546508的博客 300

Latex参考文献中大写字母编译后自动变成了小写,如何保持原字母大写形式

bib文件参考文献中大写自动变为小写,如何保持原大写问题。Latex: 保持参考文献大小写,overleaf文献编译后,原大写字母自动变成了小写字母,如何保持原字母大写

我的个人博客 5805

osgEarth添加线特征

部分关键代码: osgEarth::Annotation::FeatureNode* pathNode = 0; osgEarth::Symbology::Geometry* path = new osgEarth::Symbology::LineString(); Track*track = dynamic_cast<Track*>(entity->getProperty(PS_TRACK)); if (track == nullptr) { return; } st.

wb175208的专栏 2967

Windows11搭建GPU版本PyTorch 开发环境教程

Windows11搭建GPU版本PyTorch环境详细过程

世界那么大,我想去看看~【随心更新,看世界去了😄】 3236

ShaderJoy —— 简单又神奇的 “合体” 函数【GLSL】

smin 函数 它实际上有两种常见的实现方式 多项式 指数 多项式 smin 函数图 其对应的代码为 float smin( float a, float b ) { // 多项式 const float k = 0.5; float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0); return mix(b, a, h) - k * h * (1.0 - h); } 从上图中我们可以很明显的看出有两处不连...

ShaderJoy 的兴趣技术杂货铺 1857

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 终极重构神技!手写生产级 Redis 缓存,面试官直接膜拜!
下一篇: [Java 17] 无模版动态生成 PDF:图片嵌入与动态表格渲染实战
wáng bēn
博客等级 码龄7年 97粉丝 56原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wáng bēn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值