feat(nodetypes): add nodeTypesId prop to force recreation of nodeTypes #1007
This commit is contained in:
@@ -0,0 +1,76 @@
|
|||||||
|
import React, { useState, CSSProperties, FC } from 'react';
|
||||||
|
|
||||||
|
import ReactFlow, {
|
||||||
|
addEdge,
|
||||||
|
Elements,
|
||||||
|
Position,
|
||||||
|
Connection,
|
||||||
|
Edge,
|
||||||
|
NodeProps,
|
||||||
|
NodeTypesType,
|
||||||
|
} from 'react-flow-renderer';
|
||||||
|
|
||||||
|
const initialElements: Elements = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
sourcePosition: Position.Right,
|
||||||
|
type: 'input',
|
||||||
|
data: { label: 'Input' },
|
||||||
|
position: { x: 0, y: 80 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
type: 'a',
|
||||||
|
sourcePosition: Position.Right,
|
||||||
|
targetPosition: Position.Left,
|
||||||
|
data: { label: 'A Node' },
|
||||||
|
position: { x: 250, y: 0 },
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const buttonStyle: CSSProperties = { position: 'absolute', right: 10, top: 30, zIndex: 4 };
|
||||||
|
|
||||||
|
const nodeStyles: CSSProperties = { padding: '10px 15px', border: '1px solid #ddd' };
|
||||||
|
|
||||||
|
const NodeA: FC<NodeProps> = () => {
|
||||||
|
return <div style={nodeStyles}>A</div>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const NodeB: FC<NodeProps> = () => {
|
||||||
|
return <div style={nodeStyles}>B</div>;
|
||||||
|
};
|
||||||
|
|
||||||
|
type NodeTypesObject = {
|
||||||
|
[key: string]: NodeTypesType;
|
||||||
|
};
|
||||||
|
|
||||||
|
const nodeTypesObjects: NodeTypesObject = {
|
||||||
|
a: {
|
||||||
|
a: NodeA,
|
||||||
|
},
|
||||||
|
b: {
|
||||||
|
b: NodeB,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const NodeTypeChangeFlow = () => {
|
||||||
|
const [nodeTypesId, setNodeTypesId] = useState<string>('a');
|
||||||
|
const [elements, setElements] = useState<Elements>(initialElements);
|
||||||
|
const onConnect = (params: Connection | Edge) => setElements((els) => addEdge(params, els));
|
||||||
|
const changeType = () => setNodeTypesId((nt) => (nt === 'a' ? 'b' : 'a'));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ReactFlow
|
||||||
|
elements={elements}
|
||||||
|
onConnect={onConnect}
|
||||||
|
nodeTypes={nodeTypesObjects[nodeTypesId]}
|
||||||
|
nodeTypesId={nodeTypesId}
|
||||||
|
>
|
||||||
|
<button onClick={changeType} style={buttonStyle}>
|
||||||
|
change type
|
||||||
|
</button>
|
||||||
|
</ReactFlow>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NodeTypeChangeFlow;
|
||||||
@@ -15,6 +15,7 @@ import Hidden from './Hidden';
|
|||||||
import EdgeTypes from './EdgeTypes';
|
import EdgeTypes from './EdgeTypes';
|
||||||
import CustomConnectionLine from './CustomConnectionLine';
|
import CustomConnectionLine from './CustomConnectionLine';
|
||||||
import NodeTypeChange from './NodeTypeChange';
|
import NodeTypeChange from './NodeTypeChange';
|
||||||
|
import NodeTypesObjectChange from './NodeTypesObjectChange';
|
||||||
import UpdatableEdge from './UpdatableEdge';
|
import UpdatableEdge from './UpdatableEdge';
|
||||||
import UpdateNode from './UpdateNode';
|
import UpdateNode from './UpdateNode';
|
||||||
import SaveRestore from './SaveRestore';
|
import SaveRestore from './SaveRestore';
|
||||||
@@ -80,6 +81,10 @@ const routes = [
|
|||||||
path: '/nodetype-change',
|
path: '/nodetype-change',
|
||||||
component: NodeTypeChange,
|
component: NodeTypeChange,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/nodetypesobject-change',
|
||||||
|
component: NodeTypesObjectChange,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/updatable-edge',
|
path: '/updatable-edge',
|
||||||
component: UpdatableEdge,
|
component: UpdatableEdge,
|
||||||
|
|||||||
@@ -115,6 +115,8 @@ export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'on
|
|||||||
onEdgeMouseMove?: (event: MouseEvent, edge: Edge) => void;
|
onEdgeMouseMove?: (event: MouseEvent, edge: Edge) => void;
|
||||||
onEdgeMouseLeave?: (event: MouseEvent, edge: Edge) => void;
|
onEdgeMouseLeave?: (event: MouseEvent, edge: Edge) => void;
|
||||||
edgeUpdaterRadius?: number;
|
edgeUpdaterRadius?: number;
|
||||||
|
nodeTypesId?: string;
|
||||||
|
edgeTypesId?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ReactFlow = ({
|
const ReactFlow = ({
|
||||||
@@ -185,10 +187,12 @@ const ReactFlow = ({
|
|||||||
onEdgeMouseMove,
|
onEdgeMouseMove,
|
||||||
onEdgeMouseLeave,
|
onEdgeMouseLeave,
|
||||||
edgeUpdaterRadius = 10,
|
edgeUpdaterRadius = 10,
|
||||||
|
nodeTypesId = '1',
|
||||||
|
edgeTypesId = '1',
|
||||||
...rest
|
...rest
|
||||||
}: ReactFlowProps) => {
|
}: ReactFlowProps) => {
|
||||||
const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []);
|
const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), [nodeTypesId]);
|
||||||
const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []);
|
const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), [edgeTypesId]);
|
||||||
const reactFlowClasses = cc(['react-flow', className]);
|
const reactFlowClasses = cc(['react-flow', className]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user