一般用过figma或者设计类软件的小伙伴可能比较熟悉画布控件和缩略图的概念。它们可以帮助我们更高效的浏览图表和进行更便捷的图表操作。当然 react-flow 也提供了开箱即用的插件来实现。
上期和大家分享了我最近做的 React-Flow 中文文档。到今天为止, 核心部分已经完全翻译完成。大家可以直接使用中文文档快速学习和使用 React-Flow 搭建自己的工作流。
图片
github: https://github.com/MrXujiang/react-flow
文档地址: http://react-flow.com
接下来我会基于我写的中文文档, 带大家做一个非常有意思的工作流案例, 方便大家快速上手 React-Flow。
案例展示
图片
这个案例主要包含几个技术点:
- 如何自定义节点
- 如何自定义边
- 如何设置画布缩略图和画布控件
- 如何实现嵌套节点
- 如何设置画布样式
- 如何拖拽框选多个节点
掌握了以上几点, 我们可以实现各种场景的流程图或者工作流。上图的案例我已经推送到 Github, 大家也可以下载代码参考学习。
自定义节点
因为官方提供的节点样式比较有限,所以我们需要自定义节点和节点样式. 上述我做的案例中有三个自定义节点:
如下图所示:
图片
具体的自定义节点的方式我在中文文档中也有详细介绍和 demo, 这里给大家分享一下实现方式:
做好之后我们只需要在 app 入口注册节点即可:
是不是非常简单? 大家可以按照React-Flow 中文文档来学习更加复杂的自定义节点功能。
自定义边
自定义边和自定义节点的方式类似, 我们先来看一下自定义边的案例:
图片
大家在网上看到的花里胡哨的思维导图, 流程图的连接线, 我们其实都可以用自定义边来实现:
设置画布缩略图和画布控件
一般用过figma或者设计类软件的小伙伴可能比较熟悉画布控件和缩略图的概念。
它们可以帮助我们更高效的浏览图表和进行更便捷的图表操作。当然 react-flow 也提供了开箱即用的插件来实现。
图片
话不多说, 接下来我们就来看看具体的实现:
通过上述代码我们就能实现一个非常简单的自定义缩略图的功能, 如下图所示:
图片
如何实现嵌套节点
要想实现起嵌套节点的效果, 我们只需要调整节点结构, 即可轻松实现如下效果:
图片
如果要将一个节点添加为另一个节点的子节点,则需要使用 parentId(在以前的版本中称为parentNode)选项(您可以在节点选项部分找到所有选项的列表)。一旦我们这样做了,子节点就会相对于其父节点定位。 { x: 0, y: 0 } 的位置是父级的左上角。
代码案例如下:
import { useCallback, useState } from 'react';
import {
ReactFlow,
addEdge,
applyEdgeChanges,
applyNodeChanges,
Background,
} from '@xyflow/react';
const initialNodes = [
{
id: 'A',
type: 'group',
data: { label: null },
position: { x: 0, y: 0 },
style: {
width: 170,
height: 140,
},
},
{
id: 'B',
type: 'input',
data: { label: 'Dooring Node' },
position: { x: 10, y: 10 },
parentId: 'A',
extent: 'parent',
},
{
id: 'C',
data: { label: 'React Flow' },
position: { x: 10, y: 90 },
parentId: 'A',
extent: 'parent',
},
];
const initialEdges = [
{ id: 'b-c', source: 'B', target: 'C' }
];
const rfStyle = {
backgroundColor: '#D0C0F7',
};
function Flow() {
const [nodes, setNodes] = useState(initialNodes);
const [edges, setEdges] = useState(initialEdges);
const onNodesChange = useCallback(
(changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
[setNodes],
);
const onEdgesChange = useCallback(
(changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
[setEdges],
);
const onConnect = useCallback(
(connection) => setEdges((eds) => addEdge(connection, eds)),
[setEdges],
);
return (
<div style={{width: '100%', height: '30vh'}}>
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
fitView
style={rfStyle}
attributionPosition="top-right"
>
<Background />
</ReactFlow>
</div>
);
}
export default Flow;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
如何拖拽框选多个节点
如果我们更喜欢 Figma/sketch/design 工具控件,可以设置panOnScroll={true}和selectinotallow={true}:
- 平移:空格+拖动鼠标、滚动、鼠标中键或右键
- 缩放:俯仰或 cmd + 滚动
- 创建选区:拖动鼠标
这样就能实现类似多选框选的效果了:
图片
代码如下:
文章最开头的案例的源码我已经上传 Github 了, 大家感兴趣可以学习参考一下。完整案例效果图:
图片