React工作流

本文介绍了如何使用React Flow渲染工作流,选择react-flow-renderer处理大量节点数据,通过自定义节点样式扩展功能,并详细讲解了节点和连线的API配置。特别强调了关键ID和字符串格式的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

技术选型

领导提到要写个工作流,我们的技术栈是React,翻阅了文档之后在 jsPlumb.js 和 react-flow-renderer 中选择,因为 react-flow-renderer 相对简单,也能达到预期效果,所以选择react-flow-renderer

效果

在这里插入图片描述
在这里插入图片描述

数据格式

因为节点是后端返回的数据列表,可能会达到上千个,所以没有用拖拽的方式,选择用导入的方式。
数据格式为:

[
    {
      data: {id: "BPvugVEM1", label: "名字1", remark: "", edit: ""},
      id: "BPvugVEM1",
      type: "relation",
      position: {x: 0, y: 0},
    },
    {
      data: {id: "BPvugVEM2", label: "名字2", remark: "", edit: ""},
      id: "BPvugVEM2",
      type: "relation",
      position: {x: 0, y: 60},
    },
    {
      data: {id: "BPvugVEM3", label: "名字3", remark: "", edit: ""},
      id: "BPvugVEM3",
      type: "relation",
      position: {x: 0, y: 120},
    }
  ]

当然,这肯定是拿到后端的数据之后做的二次处理。

API

既然使用了新的东西,肯定还是要研究一下,文档又是英文的,所以针对常用的api做了简单整理。

  1. node节点

    <ReactFlow elements={rightSource} nodeTypes={nodeTypes} onNodeDoubleClick={HandleNode}>
                <Controls />    
          </ReactFlow>
    

    在这里插入图片描述
    (1) node节点的相关属性,主要是在nodes对象里面去设置

			id: nodeId,  // 节点id
                data: {
                    label: nodeName,  // 要传入节点的内容
                },
                position: {
                    x: num%2 == 0 ? 25 + 200 * (n - 1 - remender) : 25 + 200 * remender, y: 75 * num
                },  //节点在视图中的位置
                className: status_list[t.status],  // 节点样式,这个很常用
                sourcePosition: num%2 == 0 ? 'left' : 'right',  // 入口位置
                targetPosition: num%2 == 0 ? 'right' : 'left',  //出口位置
                type: 'customnode' //节点类型

(2)那么如果原始节点不符合产品的要求要做拓展,比如在右上角加上节点id,怎么办?
这里就要用到自定义样式

const CustomNode = ({ id, data, sourcePosition, targetPosition }) => (
      <div className="handle-nodes">
        <Handle type="target" position={targetPosition}/>
        <div style={{position: 'absolute', top: '0', left: '2px', fontSize: '12px'}}>{id}</div>
        <div style={{textAlign: 'center', height: '40px', lineHeight: '38px'}}>{data.label}</div>
        <Handle type="source" position={sourcePosition}/>
      </div>
    );
    const nodeTypes = {
      customnode: CustomNode
    }

这里的data就是nodes中定义的节点内容

  1. edges 连线
    除了节点之外最重要的就是连线了
				id: uuidv4(),
                source: t.from,
                target: t.to,
                type: 'smoothstep', //指定连线的类型,常用的 默认为实线,smoothstep为虚线
                arrowHeadType:"arrow", //连线带 箭头
                borderRadius: 10, // 连线的弧度
                label: 'updatable edge', //连线中的文字提示,类似 ——阿巴—— 
                animated: true, //开启动画,当为虚线是常开启动画
                style: {strokeWidth: 2} //这里可以调节连线的粗细
  1. ReactFlow props API
onNodeDoubleClick双击节点
	onNodeClick单击节点
	onNodeDragStart
	onNodeDrag
	onNodeDragStop
	onNodeMouseEnter
	onNodeMouseMove
	onNodeMouseLeave
	onNodeContextMenu
	onNodesDelete
参考文档 https://juejin.cn/post/7058483266533195807#heading-10
参考文档 https://reactflow.dev/docs/api/node-types/

工作流顶级巨坑

要注意的事情是

{ id: '1', data: { label: '-' }, position: { x: 100, y: 100 } },
  { id: '2', data: { label: 'Node 2' }, position: { x: 100, y: 200 } },
  { id: 'e1-2', source: '1', target: '2' },

这个id一定要用字符串,不然会出bug,血泪史啊 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

还要注意一点!
edges 里面的 source: String(t.from), target: String(t.to),
也要用字符串啊 不然更新了线就没了啊 啊啊啊啊啊

如果你要保存工作流,怎么获取工作流的所有信息呢,包括节点位置哦。

这一行代码就能获取所有信息啦

console.log(reactFlowInstance.toObject()) //工作流所有信息

reactFlowInstance 是谁呢?
是画布实例啦
// 画布加载完毕,保存当前画布实例
const onLoad = (instance) => setReactFlowInstance(instance);
这样就把画布上所有的信息都保存到reactFlowInstance啦,当然setReactFlowInstance是reducer,reactFlowInstance是state

### Dify 平台中的 React 工作流实现 #### 使用场景与优势 Dify作为一个开源的LLM应用开发平台,提供了丰富的功能来支持Agent构建、AI workflow编排等功能[^2]。对于希望通过图形化界面进行操作,并获得更加直观集成体验的开发者来说,Dify可能是更好的选择[^1]。 #### 实现方法 为了在Dify平台上利用React实现工作流,可以采用如下方式: - **初始化项目**:首先创建一个新的React应用程序作为前端框架的基础。 - **引入Dify SDK**:接着,在此React应用中安装并配置来自[Dify官方GitHub仓库](https://github.com/Qihoo360/fc-templates/tree/feature/main/applications/artificial-intelligence/dify-api/src)所提供的SDK库文件[^4]。这一步骤允许开发者调用由Dify提供的API接口来进行各种操作。 - **设置画布实例**:当涉及到可视化编辑器时,则需定义`onLoad`事件处理器用于捕获画布加载完成后的实例对象(`reactFlowInstance`),并通过状态管理工具将其存储起来以便后续访问和修改[^3]。 ```javascript import { useState } from 'react'; // ...其他必要的导入语句... function WorkflowEditor() { const [reactFlowInstance, setReactFlowInstance] = useState(null); function handleCanvasLoaded(instance){ setReactFlowInstance(instance); } return ( <div> {/* 渲染画布组件 */} <ReactFlow onLoad={handleCanvasLoaded}> {/* 流程图节点和其他元素 */} </ReactFlow> {/* 如果有需要展示或控制的地方可继续编写逻辑 */} </div> ); } ``` 上述代码片段展示了如何监听画布加载过程并将其实例保存至组件的状态变量中,从而使得整个流程能够被动态管理和调整。 #### 应用案例 通过这种方式建立的工作流管理系统不仅限于简单的拖拽式布局设计;借助Dify强大的后台处理能力和灵活的数据交换机制,还可以进一步扩展其应用场景,比如自动化业务流程审批、智能客服对话流转等复杂任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值