English | 简体中文
A highly customizable streaming flow builder. The registration ability can flexibly customize your nodes, different types of node display and form, etc.
https://bytedance.github.io/flow-builder
https://github.com/bytedance/flow-builder
yarn add react-flow-builder
or
npm install react-flow-builder
// index.tsx
import React, { useState, useContext } from 'react';
import FlowBuilder, {
NodeContext,
INode,
IRegisterNode,
} from 'react-flow-builder';
import './index.css';
const StartNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="start-node">{node.name}</div>;
};
const EndNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="end-node">{node.name}</div>;
};
const OtherNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="other-node">{node.name}</div>;
};
const ConditionNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="condition-node">{node.name}</div>;
};
const registerNodes: IRegisterNode[] = [
{
type: 'start',
name: 'start node',
displayComponent: StartNodeDisplay,
isStart: true,
},
{
type: 'end',
name: 'end node',
displayComponent: EndNodeDisplay,
isEnd: true,
},
{
type: 'node',
name: 'other node',
displayComponent: OtherNodeDisplay,
},
{
type: 'condition',
name: 'condition node',
displayComponent: ConditionNodeDisplay,
},
{
type: 'branch',
name: 'branch node',
conditionNodeType: 'condition',
},
];
const Demo = () => {
const [nodes, setNodes] = useState<INode[]>([]);
const handleChange = (nodes: INode[]) => {
console.log('nodes change', nodes);
setNodes(nodes);
};
return (
<FlowBuilder
nodes={nodes}
onChange={handleChange}
registerNodes={registerNodes}
/>
);
};
export default Demo;
// index.css
.start-node, .end-node {
height: 64px;
width: 64px;
border-radius: 50%;
line-height: 64px;
color: #fff;
text-align: center;
}
.start-node {
background-color: #338aff;
}
.end-node {
background-color: #666;
}
.other-node, .condition-node {
width: 224px;
border-radius: 4px;
color: #666;
background: #fff;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.08);
}
.other-node {
height: 118px;
padding: 16px;
display: flex;
flex-direction: column;
}
.condition-node {
height: 44px;
padding: 12px 16px;
}
| Property |
Description |
Type |
Required |
Default |
Version |
| backgroundColor |
The color of background |
string |
|
#F7F7F7 |
|
| className |
The class name of the container |
string |
|
- |
|
| draggable |
drag and drop |
boolean |
|
false |
1.0.0 |
| DragComponent |
custom drag component |
React.FC<DragComponent> |
|
- |
1.0.0 |
| DropComponent |
custom drop component |
React.FC<DropComponent> |
|
- |
1.0.0 |
| createUuid |
custom node uuid |
(type?: string) => string |
|
- |
2.0.0 |
| DrawerComponent |
Drawer component |
React.FC<DrawerComponent> |
|
- |
2.0.0 |
| PopoverComponent |
Popover component |
React.FC<PopoverComponent> |
|
- |
2.0.0 |
| PopconfirmComponent |
Popconfirm component |
React.FC<PopconfirmComponent> |
|
- |
2.0.0 |
| drawerProps |
Extra props of DrawerComponent |
any |
|
- |
|
| drawerVisibleWhenAddNode |
Drawer visible when add node |
boolean |
|
false |
|
| historyTool |
undo and redo |
boolean | HistoryToolConfig |
|
false |
|
| layout |
Use vertical or horizontal layout |
vertical | horizontal |
|
vertical |
|
| lineColor |
The color of line |
string |
|
#999999 |
|
| nodes |
The nodes of FlowBuilder |
Node[] |
✓ |
- |
|
| readonly |
Readonly mode, cannot add, remove, configure. |
boolean |
|
false |
|
| registerNodes |
The registered nodes |
RegisterNode[] |
✓ |
- |
|
| registerRemoteNodes |
The registered remote nodes |
RegisterRemoteNode[] |
|
- |
1.3.0 |
| showPracticalBranchNode |
- |
boolean |
|
false |
1.1.0 |
| showPracticalBranchRemove |
- |
boolean |
|
false |
1.1.0 |
| sortable |
Condition nodes can be dragged and sorted in branch |
boolean |
|
false |
1.4.0 |
| sortableAnchor |
Anchor for start dragging 序 |
ReactNode |
|
- |
1.4.0 |
| spaceX |
Horizontal spacing between nodes |
number |
|
16 |
|
| spaceY |
Vertical spacing between nodes |
number |
|
16 |
|
| zoomTool |
zoom |
boolean | ZoomToolConfig |
|
false |
|
| onChange |
Callback function for when the data change |
(nodes: Node[], changeEvent: string, nodeChanged?: INode) => void |
✓ |
- |
|
| onHistoryChange |
|
(undoDisabled: boolean, redoDisabled: boolean) => void |
|
- |
|
| onZoomChange |
|
(outDisabled: boolean, value: number, inDisabled: boolean) => void |
|
- |
|
| showArrow |
Show arrow |
boolean |
|
false |
1.4.5 |
| arrowIcon |
The icon of the arrow |
ReactNode |
|
- |
1.4.5 |
| onAddNodeSuccess |
Called when add node success |
(type: string, node: INode) => void |
|
- |
1.4.9 |
| onDropNodeSuccess |
Called when drop node success |
(type: string, node: INode) => void |
|
- |
1.4.9 |
| onRemoveNodeSuccess |
Called when remove node success |
(node: INode) => void |
|
- |
2.2.0 |
| allowStartConfig |
Allow start node config |
boolean |
|
- |
2.1.0 |
| allowEndConfig |
Allow end node config |
boolean |
|
- |
2.1.0 |
| scrollByDrag |
Scroll by mouse dragging |
boolean |
|
- |
2.6.0 |
| Property |
Description |
Type |
Default |
| hidden |
|
boolean |
false |
| max |
|
number |
10 |
| Property |
Description |
Type |
Default |
| hidden |
|
boolean |
false |
| initialValue |
|
number |
100 |
| min |
|
number |
10 |
| max |
|
number |
200 |
| step |
|
number |
10 |
| Property |
Description |
Type |
Version |
| onDragStart |
The dragStart event of the custom drag component needs to call this method to set the dragged type( dragType in BuilderContext ) |
(nodeType: string) => void |
1.0.0 |
| onDragEnd |
The dragEnd event of the custom drag component needs to call this method to clear the dragged type( dragType in BuilderContext ) |
() => void |
1.0.0 |
| Property |
Description |
Type |
Version |
| onDrop |
The drop event of the custom drop component needs to call this method to add the new node type |
() => void |
1.0.0 |
| Property |
Description |
Type |
Version |
| visible |
You can judge the boolean value of selectedNode by yourself. |
any |
2.0.0 |
| onClose |
You can also call closeDrawer by yourself. |
any |
2.0.0 |
| children |
|
any |
2.0.0 |
| title |
|
any |
2.0.0 |
| width |
|
any |
2.0.0 |
| destroyOnClose |
|
any |
2.0.0 |
| maskClosable |
|
any |
2.0.0 |
| configComponentRef |
|
React.MutableRefObject<any> |
2.5.0 |
| Property |
Description |
Type |
Version |
| visible |
|
any |
2.0.0 |
| onVisibleChange |
|
any |
2.0.0 |
| children |
|
any |
2.0.0 |
| overlayClassName |
|
any |
2.0.0 |
| placement |
|
any |
2.0.0 |
| trigger |
|
any |
2.0.0 |
| content |
|
any |
2.0.0 |
| getPopupContainer |
|
any |
2.0.0 |
| Property |
Description |
Type |
Version |
| title |
|
any |
2.0.0 |
| onConfirm |
You can also call removeNode yourself. |
any |
2.0.0 |
| children |
|
any |
2.0.0 |
| getPopupContainer |
|
any |
2.0.0 |
| Name |
Description |
Type |
Version |
| add |
add node |
(node: INode, newNodeType: string) => void | (newNodeType: string) => void |
|
| history |
undo, redo |
(type: 'undo' | 'redo') => void |
|
| remove |
remove noded |
(nodes: INode | INode[] = useContext(NodeContext)) => void |
|
| zoom |
zoom |
(type: 'out' | 'in' | number) => void |
|
| closeDrawer |
close drawer |
() => void |
|
| context |
BuilderContext |
BuilderContext |
1.3.5 |
| Name |
Description |
Type |
| buildFlatNodes |
Translate to flat nodes |
(params: {registerNodes: IRegisterNode[], nodes: INode[]}) => INode[] |
| buildTreeNodes |
Translate to tree nodes |
(params: {nodes: INode[]}) => INode[] |
| createUuid |
Create uuid |
(prefix?: string) => string |
| Property |
Description |
Type |
Required |
Default |
Version |
| addableComponent |
|
React.FC<AddableComponent> |
|
- |
|
| addableNodeTypes |
The list of nodes that can be added below the node |
string[] |
|
- |
|
| addIcon |
The icon in addable node list (There are already some default icons) |
ReactNode |
|
- |
|
| addConditionIcon |
The icon of the branch node when adding a condition (The default icon already exists) |
ReactNode |
|
- |
1.3.3 |
| className |
The class name of node |
string |
|
- |
1.3.4 |
| conditionMaxNum |
The max number of condition node |
number |
|
- |
|
| conditionNodeType |
The type of condition node |
string |
|
- |
|
| configComponent |
The Component of configuring node form |
React.FC<ConfigComponent> | React.ForwardRefExoticComponent<ConfigComponent & React.RefAttributes<any>> |
|
- |
|
| configTitle |
The drawer title of configuring node |
string | ((node: INode, nodes: INode[]) => string) |
|
- |
|
| customRemove |
Custom remove button |
boolean |
|
false |
|
| displayComponent |
The Component of displaying node |
React.FC<DisplayComponent> |
|
- |
|
| initialNodeData |
the initial data when add new node |
Record<string, any> |
|
- |
|
| isStart |
Is start node |
boolean |
|
false |
|
| isEnd |
Is end node |
boolean |
|
false |
|
| isLoop |
Is loop node |
boolean |
|
false |
1.4.6 |
| name |
The name of node |
string |
✓ |
- |
|
| removeConfirmTitle |
The confirmation information before deleting the node. The title of Popconfirm |
string | ReactNode |
|
Are you sure to remove this node? |
|
| showPracticalBranchNode |
- |
boolean |
|
false |
1.1.0 |
| showPracticalBranchRemove |
- |
boolean |
|
false |
1.1.0 |
| type |
The type of node, promise start is start node type and end is end node type |
string |
✓ |
- |
|
| Property |
Description |
Type |
Required |
Default |
Version |
| url |
remote url |
string |
✓ |
- |
1.3.0 |
| cssUrl |
remote css url |
string |
|
- |
1.3.0 |
| Property |
Description |
Type |
| node |
The all information of node (NodeContext is recommended since V1) |
Node |
| nodes |
(BuilderContext is recommended since V1) |
Node[] |
| readonly |
(BuilderContext is recommended since V1) |
boolean |
| remove |
Remove node (useAction is recommended since V1) |
(nodes?: INode | INode[]) => void |
| Property |
Description |
Type |
| cancel |
Called on cancel, used to close the drawer (useDrawer is recommended since V1) |
() => void |
| node |
The all information of node (NodeContext is recommended since V1) |
Node |
| nodes |
(BuilderContext is recommended since V1) |
Node[] |
| save |
Called on save node data (automatically close the drawer, no need to call cancel). FlowBuilder will set the validateStatusError property according to the second param (useDrawer is recommended since V1) |
(values: any, validateStatusError?: boolean) => void |
| Property |
Description |
Type |
| add |
|
(type: string) => void |
| node |
The all information of node (NodeContext is recommended since V1) |
Node |
| nodes |
(BuilderContext is recommended since V1) |
Node[] |
| Property |
Description |
Type |
| children |
The condition nodes array of branch node, or the next flow of condition node |
Node[] |
| configuring |
Whether configuring of node. The display Component can highlight the node according to this property |
boolean |
| data |
The data of node |
any |
| id |
The unique id of node |
string |
| name |
The name of node. Same as the name of the registered node |
string |
| path |
The full path in FlowBuilder |
string[] |
| type |
The type of node. Same as the type of the registered node |
string |
| validateStatusError |
The Component of configuring node form validate failed. The display Component can highlight the node according to this property |
boolean |
Added since V1
In the context of FlowBuilder the following contexts can be used
Contains props and state. The following is the state:
| Property |
Description |
Type |
| zoomValue |
current zoom value |
number |
| setZoomValue |
set zoomValue |
(zoomValue: number) => void |
| historyRecords |
history nodes records |
INode[][] |
| setHistoryRecords |
set historyRecords |
(records: INode[][]) => void |
| activeHistoryRecordIndex |
current index in history nodes records |
number |
| setActiveHistoryRecordIndex |
set activeHistoryRecordIndex |
(index: number) => void |
| selectedNode |
current selecred node |
INode | undefined |
| setSelectedNode |
set selectedNode |
(node: INode | undefined) => void |
| drawerTitle |
the title of Drawer |
string |
| setDrawerTitle |
set drawerTitle |
(title: string) => void |
| dragType |
dragged node type |
string |
| setDragType |
set dragType |
(type: string) => void |
Get the data of the node where it is used. For details Node
Added since V1
In the context of FlowBuilder the following hooks can be used
| Property |
Description |
Type |
Version |
| clickNode |
click node |
(node: INode = useContext(NodeContext)) => void |
|
| addNode |
add one node. (Get the current node through NodeContext when there is no node property) |
(node: INode, newNodeType: string) => void | (newNodeType: string) => void |
|
| addNodeInLoop |
add one node in loop node. |
(newNodeType: string) => void |
1.4.6 |
| removeNode |
remove one node or more nodes. |
(targetNode: INode | INode[] = useContext(NodeContext)) => void |
|
| Property |
Description |
Type |
| closeDrawer |
close Drawer and clear selectedNode |
() => void |
| saveDrawer |
save the content in Drawer (same as the save method in ConfigComponent) |
(values: any, validateStatusError?: boolean) => void |
| Property |
Description |
Type |
| minZoom |
minimum zoom value |
number |
| maxZoom |
maximum zoom value |
number |
| zoom |
change zoom value (same as the zoom method in FlowBuilderInstance) |
(type: 'out' | 'in' | number) => void |
| Property |
Description |
Type |
| maxLength |
Maximum length of history nodes records |
number |
| pushHistory |
add history nodes record |
(record?: INode[] = useContext(BuilderContext).nodes) => void |
| history |
undo, redo (same as the history method in FlowBuilderInstance) |
(type: 'undo' | 'redo') => void |
| Property |
Description |
Type |
Version |
| backward |
sort to backward |
(node: INode = useContext(NodeContext)) => void |
1.4.3 |
| forward |
sort to forward |
(node: INode = useContext(NodeContext)) => void |
1.4.3 |
| end |
sort to end |
(node: INode = useContext(NodeContext)) => void |
1.4.3 |
| start |
sort to start |
(node: INode = useContext(NodeContext)) => void |
1.4.3 |