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 |