信钢销售部杨微微 發表於 2023-5-25 11:25:00

使用react-flow制作流程图

<strong>1.react-flow</strong>
<p> react-flow是一个用于构建基于节点的应用程序的库。这些可以是简单的静态图或复杂的基于节点的编辑器。同时react-flow支持自定义节点类型和边线类型,并且它附带一些组件,可以查看缩略图的Mini Map和悬浮控制器Controls.</p>
<h4>2、react-flow 的安装</h4>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">  npm install react-flow-renderer    # npm
  yarn add react-flow-renderer       # Yarn
</pre>
</div>
<h5>3.react-flow基本使用  </h5>
<p>  1、每个节点固定格式 里面添加内容</p>
<p><span style="font-size: 18px">  代码</span></p>
<p>      index.tsx</p>
<div class="cnblogs_code">
<pre>import React from 'react';
import ReactFlow, {
addEdge,
MiniMap,
Controls,
Background,
useNodesState,
useEdgesState,
} from 'react-flow-renderer';

import { nodes as initialNodes, edges as initialEdges } from './initial-elements';

const OverviewFlow = () =&gt; {
const = useNodesState(initialNodes);
const = useEdgesState(initialEdges);
const onConnect = (params) =&gt; setEdges((eds) =&gt; addEdge(params, eds));

return (
    &lt;ReactFlow
      nodes={nodes} // 节点
      edges={edges} // 连接线
      onNodesChange={onNodesChange} // 节点拖拽等改变
      onEdgesChange={onEdgesChange} // 连接线拖拽等改变
      onConnect={onConnect} // 节点直接连接
      fitView // 渲染节点数据
      attributionPosition="top-right" // react-flow的位置,类似水印,可以通过css隐藏
    &gt;
      // 背景图 可以配置颜色 方格宽度
      &lt;Background color="#aaa" gap={16} /&gt;
    &lt;/ReactFlow&gt;
);
};

export default OverviewFlow;</pre>
</div>
<p>initial-elements.ts节点与连接线数据</p>
<div class="cnblogs_code">
<pre>import { MarkerType } from 'react-flow-renderer'<span style="color: rgba(0, 0, 0, 1)">;

export const nodes </span>=<span style="color: rgba(0, 0, 0, 1)"> [
{
    id: </span>'1', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> id必须</span>
    type: 'input', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 类型: input开始default默认output结束 区别在于连接点不一样</span>
    data: { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 额外的数据</span>
      label: ( <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 节点名称</span>
      &lt;&gt;<span style="color: rgba(0, 0, 0, 1)">
          Welcome to </span>&lt;strong&gt;React Flow!&lt;/strong&gt;
      &lt;/&gt;
<span style="color: rgba(0, 0, 0, 1)">      ),
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> value: 5, .... // 可以将其他数据放入</span>
<span style="color: rgba(0, 0, 0, 1)">    },
    position: { x: </span>250, y: 0 }, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 节点位置</span>
<span style="color: rgba(0, 0, 0, 1)">},
{
    id: </span>'2'<span style="color: rgba(0, 0, 0, 1)">,
    data: {
      label: (
      </span>&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">
          This is a </span>&lt;strong&gt;<span style="color: rgba(0, 0, 255, 1)">default</span> node&lt;/strong&gt;
      &lt;/&gt;
<span style="color: rgba(0, 0, 0, 1)">      ),
    },
    position: { x: </span>100, y: 100<span style="color: rgba(0, 0, 0, 1)"> },
},
{
    id: </span>'3'<span style="color: rgba(0, 0, 0, 1)">,
    data: {
      label: (
      </span>&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">
          This one has a </span>&lt;strong&gt;custom style&lt;/strong&gt;
      &lt;/&gt;
<span style="color: rgba(0, 0, 0, 1)">      ),
    },
    position: { x: </span>400, y: 100<span style="color: rgba(0, 0, 0, 1)"> },
    style: {
      background: </span>'#D6D5E6'<span style="color: rgba(0, 0, 0, 1)">,
      color: </span>'#333'<span style="color: rgba(0, 0, 0, 1)">,
      border: </span>'1px solid #222138'<span style="color: rgba(0, 0, 0, 1)">,
      width: </span>180<span style="color: rgba(0, 0, 0, 1)">,
    },
},
{
    id: </span>'4'<span style="color: rgba(0, 0, 0, 1)">,
    position: { x: </span>250, y: 200<span style="color: rgba(0, 0, 0, 1)"> },
    data: {
      label: </span>'Another default node'<span style="color: rgba(0, 0, 0, 1)">,
    },
},
{
    id: </span>'5'<span style="color: rgba(0, 0, 0, 1)">,
    data: {
      label: </span>'Node id: 5'<span style="color: rgba(0, 0, 0, 1)">,
    },
    position: { x: </span>250, y: 325<span style="color: rgba(0, 0, 0, 1)"> },
},
{
    id: </span>'6'<span style="color: rgba(0, 0, 0, 1)">,
    type: </span>'output'<span style="color: rgba(0, 0, 0, 1)">,
    data: {
      label: (
      </span>&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">
          An </span>&lt;strong&gt;output node&lt;/strong&gt;
      &lt;/&gt;
<span style="color: rgba(0, 0, 0, 1)">      ),
    },
    position: { x: </span>100, y: 480<span style="color: rgba(0, 0, 0, 1)"> },
},
{
    id: </span>'7'<span style="color: rgba(0, 0, 0, 1)">,
    type: </span>'output'<span style="color: rgba(0, 0, 0, 1)">,
    data: { label: </span>'Another output node'<span style="color: rgba(0, 0, 0, 1)"> },
    position: { x: </span>400, y: 450<span style="color: rgba(0, 0, 0, 1)"> },
},
];

export const edges </span>=<span style="color: rgba(0, 0, 0, 1)"> [
{ id: </span>'e1-2', source: '1', target: '2', label: 'this is an edge label'<span style="color: rgba(0, 0, 0, 1)"> },
{ id: </span>'e1-3', source: '1', target: '3'<span style="color: rgba(0, 0, 0, 1)"> },
{
    id: </span>'e3-4', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> id必须</span>
    source: '3', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线起始节点id</span>
    target: '4', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线结束节点id</span>
    animated: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线是否有动画</span>
    label: 'animated edge', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线名称</span>
<span style="color: rgba(0, 0, 0, 1)">},
{
    id: </span>'e4-5'<span style="color: rgba(0, 0, 0, 1)">,
    source: </span>'4'<span style="color: rgba(0, 0, 0, 1)">,
    target: </span>'5'<span style="color: rgba(0, 0, 0, 1)">,
    label: </span>'edge with arrow head'<span style="color: rgba(0, 0, 0, 1)">,
    markerEnd: { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线尾部的箭头</span>
<span style="color: rgba(0, 0, 0, 1)">      type: MarkerType.ArrowClosed,
    },
},
{
    id: </span>'e5-6'<span style="color: rgba(0, 0, 0, 1)">,
    source: </span>'5'<span style="color: rgba(0, 0, 0, 1)">,
    target: </span>'6'<span style="color: rgba(0, 0, 0, 1)">,
    type: </span>'smoothstep', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线类型 default straight step smoothstep</span>
    label: 'smooth step edge'<span style="color: rgba(0, 0, 0, 1)">,
},
{
    id: </span>'e5-7'<span style="color: rgba(0, 0, 0, 1)">,
    source: </span>'5'<span style="color: rgba(0, 0, 0, 1)">,
    target: </span>'7'<span style="color: rgba(0, 0, 0, 1)">,
    type: </span>'step'<span style="color: rgba(0, 0, 0, 1)">,
    style: { stroke: </span>'#f6ab6c' }, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线颜色</span>
    label: 'a step edge'<span style="color: rgba(0, 0, 0, 1)">,
    animated: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
    labelStyle: { fill: </span>'#f6ab6c', fontWeight: 700 }, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线名称样式</span>
<span style="color: rgba(0, 0, 0, 1)">},
];</span></pre>
</div>
<p> <span style="font-size: 18px"> 效果图</span><img src="https://img2023.cnblogs.com/blog/2749674/202305/2749674-20230525105241407-1750363191.png"></p>
<p>&nbsp;</p>
<p>2、自定义每个节点中的内容和样式 以及连接点</p>
<p>  这个是静态的 展示流程图 想拖动节点 加上1里面的&nbsp;onNodesChange... 的参数即可</p>
<p>index.tsx</p>
<div class="cnblogs_code">
<pre>import React, {useEffect} from 'react'<span style="color: rgba(0, 0, 0, 1)">;

import ReactFlow, {
    useNodesState,
    useEdgesState,
} from </span>'react-flow-renderer'<span style="color: rgba(0, 0, 0, 1)">;

import {nodes as initialNodes, edges as initialEdges} from </span>'./initial-elements'<span style="color: rgba(0, 0, 0, 1)">;
import CustomNode from </span>'./ResizableNode'<span style="color: rgba(0, 0, 0, 1)">; <span style="color: rgba(255, 0, 0, 1)">//自定义的渲染每个节点的代码</span>

const nodeTypes </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    custom: CustomNode, <span style="color: rgba(255, 0, 0, 1)">//自定义的内容</span>
};
const OverviewFlow </span>= ({resizeFlag}: any) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    const </span>=<span style="color: rgba(0, 0, 0, 1)"> useNodesState(initialNodes);
    const </span>=<span style="color: rgba(0, 0, 0, 1)"> useEdgesState(initialEdges);

    useEffect(() </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      setNodes([]);
      setTimeout(() </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            setNodes(initialNodes);
      }, </span>50<span style="color: rgba(0, 0, 0, 1)">);
    }, );

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!nodes?<span style="color: rgba(0, 0, 0, 1)">.length) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;<span style="color: rgba(0, 0, 0, 1)">ReactFlow
            nodes</span>={nodes} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 节点</span>
            edges={edges} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线</span>
            panOnDrag={<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">}
            zoomOnDoubleClick</span>={<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">}
            zoomOnPinch</span>={<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">}
            zoomOnScroll</span>={<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">}
            panOnScroll</span>={<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">}
            fitView </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 渲染节点数据</span>
            nodeTypes=<span style="color: rgba(0, 0, 0, 1)">{nodeTypes}
            attributionPosition</span>="top-left" <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> react-flow的位置,类似水印,可以通过css隐藏 =》 </span><span style="color: rgba(51, 153, 102, 1)">.react-flow__attribution.left {display: none};</span></pre>
<pre>      &gt;<span style="color: rgba(0, 0, 0, 1)">
            {</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> &lt;Background color="#aaa" gap={16} /&gt; </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">}
      </span>&lt;/ReactFlow&gt;
<span style="color: rgba(0, 0, 0, 1)">    );
};

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> OverviewFlow;</pre>
</div>
<p>&nbsp;initial-elements.ts</p>
<div class="cnblogs_code">
<pre>import {MarkerType, Position} from 'react-flow-renderer'<span style="color: rgba(0, 0, 0, 1)">;

const styles </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    color: </span>'#333'<span style="color: rgba(0, 0, 0, 1)">,
    border: </span>'1px solid #4E8FF0'<span style="color: rgba(0, 0, 0, 1)">,
    borderRadius: </span>'5px'<span style="color: rgba(0, 0, 0, 1)">,
    background: </span>'white'<span style="color: rgba(0, 0, 0, 1)">,

};<br>//因为数据太多删除了几个 不过格式都是这样写
export const nodes </span>=<span style="color: rgba(0, 0, 0, 1)"> [
    {
      id: </span>'0'<span style="color: rgba(0, 0, 0, 1)">,
      type: </span>'custom',<span style="color: rgba(255, 0, 0, 1)">//有input,output,default三种,input只有一个输出,output只有一个输入,default输入输出各有一个 或者自定义的</span>
<span style="color: rgba(0, 0, 0, 1)">      data: {
            label: </span>''<span style="color: rgba(0, 0, 0, 1)">,
      },
      position: {x: </span>-20, y: 40}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 节点位置</span>
<span style="color: rgba(0, 0, 0, 1)">      style: {
            width: </span>1550<span style="color: rgba(0, 0, 0, 1)">,
            height: </span>500<span style="color: rgba(0, 0, 0, 1)">,
            border: </span>'1px solid #91caff'<span style="color: rgba(0, 0, 0, 1)">,
            borderRadius: </span>'15px'<span style="color: rgba(0, 0, 0, 1)">,
            color: </span>'#4585F2'<span style="color: rgba(0, 0, 0, 1)">,
            background: </span>'#E2E6F3'<span style="color: rgba(0, 0, 0, 1)">,
            zIndex: </span>-2<span style="color: rgba(0, 0, 0, 1)">,
      },
    },
    {
      id: </span>'1', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> id必须</span>
      type: 'custom', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 类型: input开始default默认output结束 区别在于连接点不一样</span>
      data: { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 额外的数据</span>
<span style="color: rgba(0, 0, 0, 1)">            label:
                </span>'任务1'<span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> value: 1 // .... // 可以将其他数据放入</span>
<span style="color: rgba(0, 0, 0, 1)">      },
      position: {x: </span>200, y: 70}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 节点位置</span>
<span style="color: rgba(0, 0, 0, 1)">      style: {
            width: </span>200<span style="color: rgba(0, 0, 0, 1)">,
            height: </span>150<span style="color: rgba(0, 0, 0, 1)">,
            ...styles,
      },
    },
    {
      id: </span>'2'<span style="color: rgba(0, 0, 0, 1)">,
      type: </span>'custom'<span style="color: rgba(0, 0, 0, 1)">,
      data: {
            label: </span>'任务2'<span style="color: rgba(0, 0, 0, 1)">,
      },
      position: {x: </span>450, y: 70<span style="color: rgba(0, 0, 0, 1)">},
      style: {
            width: </span>200<span style="color: rgba(0, 0, 0, 1)">,
            height: </span>150<span style="color: rgba(0, 0, 0, 1)">,
      },
    },
    {
      id: </span>'3'<span style="color: rgba(0, 0, 0, 1)">,
      type: </span>'custom'<span style="color: rgba(0, 0, 0, 1)">,

      data: {
            label: (
                </span>'任务3'<span style="color: rgba(0, 0, 0, 1)">
            ),
      },
      position: {x: </span>700, y: 70<span style="color: rgba(0, 0, 0, 1)">},
      style: {
            width: </span>200<span style="color: rgba(0, 0, 0, 1)">,
            height: </span>150<span style="color: rgba(0, 0, 0, 1)">,
            ...styles,
      },
    }</span><span style="color: rgba(0, 0, 0, 1)">
];

export const edges </span>=<span style="color: rgba(0, 0, 0, 1)"> [
    {
      id: </span>'1-2'<span style="color: rgba(0, 0, 0, 1)">,
      source: </span>'1'<span style="color: rgba(0, 0, 0, 1)">,
      target: </span>'2'<span style="color: rgba(0, 0, 0, 1)">,
      markerEnd: { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线尾部的箭头</span>
<span style="color: rgba(0, 0, 0, 1)">            type: MarkerType.ArrowClosed,
            color: </span>'#4E8FF0'<span style="color: rgba(0, 0, 0, 1)">,
      },
      style: {stroke: </span>'#4E8FF0'}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线颜色</span>
      labelStyle: {fill: '#4E8FF0', fontWeight: 700}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线名称样式</span>
<span style="color: rgba(0, 0, 0, 1)">    },
    {
      id: </span>'2-3', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> id必须</span>
      source: '2', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线起始节点id</span>
      target: '3', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线结束节点id</span>
      markerEnd: { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线尾部的箭头</span>
<span style="color: rgba(0, 0, 0, 1)">            type: MarkerType.ArrowClosed,
            color: </span>'#4E8FF0'<span style="color: rgba(0, 0, 0, 1)">,
      },
      style: {stroke: </span>'#4E8FF0'}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线颜色</span>
      labelStyle: {fill: '#4E8FF0', fontWeight: 700}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线名称样式</span>
<span style="color: rgba(0, 0, 0, 1)">    },
    {
      id: </span>'3-4'<span style="color: rgba(0, 0, 0, 1)">,
      source: </span>'3'<span style="color: rgba(0, 0, 0, 1)">,
      target: </span>'4'<span style="color: rgba(0, 0, 0, 1)">,
      style: {stroke: </span>'#4E8FF0'}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线颜色</span>
      labelStyle: {fill: '#4E8FF0', fontWeight: 700}, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线名称样式</span>
      markerEnd: { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接线尾部的箭头</span>
<span style="color: rgba(0, 0, 0, 1)">            type: MarkerType.ArrowClosed,
            color: </span>'#4E8FF0'<span style="color: rgba(0, 0, 0, 1)">,
      },
    }</span><span style="color: rgba(0, 0, 0, 1)">
];</span></pre>
</div>
<p>&nbsp;</p>
<pre>ResizableNode.tsx</pre>
<div class="cnblogs_code">
<pre>import React, {memo} from 'react'<span style="color: rgba(0, 0, 0, 1)">;
import {Handle, Position} from </span>'react-flow-renderer'<span style="color: rgba(0, 0, 0, 1)">;
import className from </span>'./home.module.scss'<span style="color: rgba(0, 0, 0, 1)">;
import newTask from </span>'@/static/newTask.png'<span style="color: rgba(0, 0, 0, 1)">;
import Operator from </span>'@/static/OperatorConfig.png'<span style="color: rgba(0, 0, 0, 1)">;
import DeployTask from </span>'@/static/DeploymentTask.png'<span style="color: rgba(0, 0, 0, 1)">;
import TaskReview from </span>'@/static/TaskReview.png'<span style="color: rgba(0, 0, 0, 1)">;
import TaskLaunch from </span>'@/static/TaskLaunch.png'<span style="color: rgba(0, 0, 0, 1)">;
import {Button} from </span>'antd'<span style="color: rgba(0, 0, 0, 1)">;

const datadevelopment </span>=<span style="color: rgba(0, 0, 0, 1)"> [
    {
      id: </span>'0'<span style="color: rgba(0, 0, 0, 1)">,
    },
    {
      src: newTask,
      id: </span>'1'<span style="color: rgba(0, 0, 0, 1)">,
      button: </span>'快速开始'<span style="color: rgba(0, 0, 0, 1)">,
      url: </span>''<span style="color: rgba(0, 0, 0, 1)">,
      width: </span>'50px'<span style="color: rgba(0, 0, 0, 1)">,
      height: </span>'50px'<span style="color: rgba(0, 0, 0, 1)">,
    },
    {
      src: Operator,
      id: </span>'11'<span style="color: rgba(0, 0, 0, 1)">,
      button: </span>'配置说明'<span style="color: rgba(0, 0, 0, 1)">,
      link: </span>''<span style="color: rgba(0, 0, 0, 1)">,
      width: </span>'45px'<span style="color: rgba(0, 0, 0, 1)">,
      height: </span>'45px'<span style="color: rgba(0, 0, 0, 1)">,
    },
    {
      src: DeployTask,
      id: </span>'3'<span style="color: rgba(0, 0, 0, 1)">,
      title: </span>'任务基本信息'<span style="color: rgba(0, 0, 0, 1)">,
      width: </span>'55px'<span style="color: rgba(0, 0, 0, 1)">,
      height: </span>'55px'<span style="color: rgba(0, 0, 0, 1)">,
    },

];

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> memo(({data, id, isConnectable}: any) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(1, data);</span>
    const position = (sum: any) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (sum) {
            </span><span style="color: rgba(0, 0, 255, 1)">case</span> '6'<span style="color: rgba(0, 0, 0, 1)">:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Position.Right;
            </span><span style="color: rgba(0, 0, 255, 1)">case</span> '9'<span style="color: rgba(0, 0, 0, 1)">:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Position.Top;
            </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Position.Left;
      }
    };

    const pageButton </span>= (item: any) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (item.link) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                </span>&lt;<span style="color: rgba(0, 0, 0, 1)">Button
                  target</span>='_blank'<span style="color: rgba(0, 0, 0, 1)">
                  type</span>='link'<span style="color: rgba(0, 0, 0, 1)">
                  htmlType</span>='button'<span style="color: rgba(0, 0, 0, 1)">
                  href</span>=<span style="color: rgba(0, 0, 0, 1)">{item.link}
                </span>&gt;<span style="color: rgba(0, 0, 0, 1)"> {item.button}
                </span>&lt;/Button&gt;
<span style="color: rgba(0, 0, 0, 1)">            );
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                </span>&lt;<span style="color: rgba(0, 0, 0, 1)">Button
                  style</span>=<span style="color: rgba(0, 0, 0, 1)">{{
                        background: </span>'linear-gradient(90deg,#2468E8,#2C61E4,#4148D0,#5127B8)'<span style="color: rgba(0, 0, 0, 1)">,
                        border: </span>'none'<span style="color: rgba(0, 0, 0, 1)">,
                  }}
                  onClick</span>={e =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        e.stopPropagation();
                        window.location.hash </span>=<span style="color: rgba(0, 0, 0, 1)"> item.url;
                  }}
                  type</span>='primary'
                &gt;<span style="color: rgba(0, 0, 0, 1)"> {item.button}
                </span>&lt;/Button&gt;
<span style="color: rgba(0, 0, 0, 1)">            );
      }
    };

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;div className={className.ResicabelNode}&gt;
            &lt;<span style="color: rgba(0, 0, 0, 1)">Handle
                style</span>={{visibility: 'hidden'<span style="color: rgba(0, 0, 0, 1)">}}
                type</span>="target"<span style="color: rgba(0, 0, 0, 1)">
                position</span>=<span style="color: rgba(0, 0, 0, 1)">{position(id)}
                isConnectable</span>=<span style="color: rgba(0, 0, 0, 1)">{isConnectable}
            </span>/&gt;
<span style="color: rgba(0, 0, 0, 1)">            {
                datadevelopment.filter((item: any) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> item.id ===<span style="color: rgba(0, 0, 0, 1)"> id;
                }).map((item: any) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                        </span>+item.id &lt; 12
                            ? &lt;<span style="color: rgba(0, 0, 0, 1)">div
                              key</span>=<span style="color: rgba(0, 0, 0, 1)">{item.id}
                              className</span>=<span style="color: rgba(0, 0, 0, 1)">{className.nodeContent}
                              style</span>=<span style="color: rgba(0, 0, 0, 1)">{data.style}
                            </span>&gt;<span style="color: rgba(0, 0, 0, 1)">
                              {item.src </span>? &lt;img style={{width: item.width, height: item.height}} src={item.src} /&gt; : null}
                              &lt;div className={className.nodeRightbox}&gt;
                                    &lt;p className={className.nodelabel}&gt;{data.label}&lt;/p&gt;
<span style="color: rgba(0, 0, 0, 1)">                                    {item.button
                                        </span>?<span style="color: rgba(0, 0, 0, 1)"> pageButton(item)
                                        : </span>&lt;span className={className.nodelabelTitle}&gt;{item.title}&lt;/span&gt;}
                              &lt;/div&gt;
                            &lt;/div&gt;
                            : &lt;<span style="color: rgba(0, 0, 0, 1)">div
                              key</span>=<span style="color: rgba(0, 0, 0, 1)">{item.id}
                              className</span>=<span style="color: rgba(0, 0, 0, 1)">{className.dataDistribution}
                              style</span>=<span style="color: rgba(0, 0, 0, 1)">{data.style}
                            </span>&gt;<span style="color: rgba(0, 0, 0, 1)">
                              {
                                    item.order
                                        </span>? &lt;p className={className.circle}&gt;<span style="color: rgba(0, 0, 0, 1)">
                                          {item.order}
                                        </span>&lt;/p&gt; : null
<span style="color: rgba(0, 0, 0, 1)">                              }
                              </span>&lt;p className={className.nodelabel}&gt;{data.label}&lt;/p&gt;
<span style="color: rgba(0, 0, 0, 1)">                              {
                                    item.button </span>? pageButton(item) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">
                              }
                            </span>&lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">                  );
                })
            }
            </span>&lt;<span style="color: rgba(0, 0, 0, 1)">Handle
                style</span>={{visibility: 'hidden'<span style="color: rgba(0, 0, 0, 1)">}}
                type</span>='source'<span style="color: rgba(0, 0, 0, 1)">
                position</span>={id === '11'
                || id === '5' ?<span style="color: rgba(0, 0, 0, 1)"> Position.Bottom : Position.Right}
                id</span>='a'<span style="color: rgba(0, 0, 0, 1)">
                className</span>='my_handle'<span style="color: rgba(0, 0, 0, 1)">
                isConnectable</span>=<span style="color: rgba(0, 0, 0, 1)">{isConnectable}
            </span>/&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    );
});</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;效果图</p>
<p><img src="https://img2023.cnblogs.com/blog/2749674/202305/2749674-20230525110902651-227436945.png"></p>
<p>&nbsp;</p>
<p>&nbsp;收集的一些关于 react-flow 参数讲解链接以及官网地址</p>
<p>  https://www.5axxw.com/wiki/content/obkffc</p>
<p>&nbsp;  https://reactflow.dev/</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/qing1224/p/17430652.html
頁: [1]
查看完整版本: 使用react-flow制作流程图