用Vue Flow绘制一个完美流程图

该文章已生成可运行项目,

Vue Flow 简介

Vue Flow 是一个基于 Vue.js 的流程图库,专为构建交互式流程图设计。它支持节点拖拽、连线、缩放、撤销/重做等功能,适用于工作流、系统架构图等场景。以下内容将演示如何用 Vue Flow 绘制一个完整的流程图,并提供代码示例。


安装与基础配置

确保项目已安装 Vue 3,使用以下命令安装 Vue Flow:

npm install @vue-flow/core

基础配置示例:

<template>
  <VueFlow v-model="elements" />
</template>

<script>
import { VueFlow } from '@vue-flow/core';

export default {
  components: { VueFlow },
  data() {
    return {
      elements: [
        { id: '1', position: { x: 0, y: 0 }, data: { label: '节点1' } },
        { id: '2', position: { x: 200, y: 100 }, data: { label: '节点2' } },
        { id: 'e1-2', source: '1', target: '2' },
      ],
    };
  },
};
</script>


自定义节点与样式

通过 node-types 自定义节点类型,并添加样式:

<template>
  <VueFlow 
    v-model="elements" 
    :node-types="nodeTypes" 
    :default-edge-options="{ type: 'step' }"
  />
</template>

<script>
import { VueFlow } from '@vue-flow/core';

export default {
  components: { VueFlow },
  data() {
    return {
      elements: [
        { 
          id: '1', 
          type: 'custom', 
          position: { x: 0, y: 0 }, 
          data: { label: '开始' } 
        },
        { 
          id: '2', 
          position: { x: 200, y: 100 }, 
          data: { label: '处理' } 
        },
        { id: 'e1-2', source: '1', target: '2' },
      ],
      nodeTypes: {
        custom: {
          template: `<div class="custom-node">{{ node.data.label }}</div>`,
          style: { background: '#ff9', border: '2px solid #f90' },
        },
      },
    };
  },
};
</script>

<style>
.custom-node {
  padding: 10px;
  border-radius: 5px;
}
</style>


交互功能实现

添加拖拽、连线事件和撤销/重做功能:

<template>
  <VueFlow 
    v-model="elements" 
    @node-drag="onNodeDrag"
    @connect="onConnect"
  />
  <button @click="undo">撤销</button>
  <button @click="redo">重做</button>
</template>

<script>
import { VueFlow, useVueFlow } from '@vue-flow/core';

export default {
  components: { VueFlow },
  setup() {
    const { undo, redo } = useVueFlow();
    return { undo, redo };
  },
  data() {
    return {
      elements: [...],
    };
  },
  methods: {
    onNodeDrag(event, node) {
      console.log('节点移动:', node.id);
    },
    onConnect(connection) {
      this.elements.push({
        id: `e${connection.source}-${connection.target}`,
        source: connection.source,
        target: connection.target,
      });
    },
  },
};
</script>


高级功能:动态数据与布局

结合外部数据生成流程图,并自动布局:

<template>
  <VueFlow v-model="elements" :fit-view-on-init="true" />
</template>

<script>
import { VueFlow } from '@vue-flow/core';
import { getLayoutedElements } from './layout.js'; // 假设有布局算法

export default {
  components: { VueFlow },
  data() {
    return {
      elements: getLayoutedElements([
        { id: '1', data: { label: '步骤1' } },
        { id: '2', data: { label: '步骤2' } },
        { id: 'e1-2', source: '1', target: '2' },
      ]),
    };
  },
};
</script>


总结

Vue Flow 提供了灵活的 API 和丰富的交互功能,通过自定义节点、事件处理和布局算法,可以快速构建复杂的流程图。以上代码示例涵盖了从基础配置到高级功能的完整流程,开发者可根据实际需求进一步扩展。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值