diff --git a/packages/react/src/container/NodeRenderer/index.tsx b/packages/react/src/container/NodeRenderer/index.tsx
index 73808da1..7c8137ca 100644
--- a/packages/react/src/container/NodeRenderer/index.tsx
+++ b/packages/react/src/container/NodeRenderer/index.tsx
@@ -76,74 +76,29 @@ const NodeRenderer = (props: NodeRendererProps) => {
return (
{nodes.map((node) => {
- let nodeType = node.type || 'default';
-
- if (!props.nodeTypes[nodeType]) {
- onError?.('003', errorMessages['error003'](nodeType));
-
- nodeType = 'default';
- }
-
- const NodeComponent = (props.nodeTypes[nodeType] || props.nodeTypes.default) as ComponentType;
- const isDraggable = !!(node.draggable || (nodesDraggable && typeof node.draggable === 'undefined'));
- const isSelectable = !!(node.selectable || (elementsSelectable && typeof node.selectable === 'undefined'));
- const isConnectable = !!(node.connectable || (nodesConnectable && typeof node.connectable === 'undefined'));
- const isFocusable = !!(node.focusable || (nodesFocusable && typeof node.focusable === 'undefined'));
-
- const clampedPosition = props.nodeExtent
- ? clampPosition(node.computed?.positionAbsolute, props.nodeExtent)
- : node.computed?.positionAbsolute;
-
- const posX = clampedPosition?.x ?? 0;
- const posY = clampedPosition?.y ?? 0;
- const posOrigin = getPositionWithOrigin({
- x: posX,
- y: posY,
- width: node.computed?.width ?? node.width ?? 0,
- height: node.computed?.height ?? node.height ?? 0,
- origin: node.origin || props.nodeOrigin,
- });
- const initialized = (!!node.computed?.width && !!node.computed?.height) || (!!node.width && !!node.height);
-
return (
-
);
})}
@@ -151,6 +106,103 @@ const NodeRenderer = (props: NodeRendererProps) => {
);
};
+const NodeComponentWrapper = memo(function NodeComponentWrapper(props: {
+ id: string;
+ nodeExtent: NodeRendererProps['nodeExtent'];
+ nodeTypes: NodeRendererProps['nodeTypes'];
+ nodeOrigin: NodeRendererProps['nodeOrigin'];
+ onNodeClick: NodeRendererProps['onNodeClick'];
+ onNodeMouseEnter: NodeRendererProps['onNodeMouseEnter'];
+ onNodeMouseMove: NodeRendererProps['onNodeMouseMove'];
+ onNodeMouseLeave: NodeRendererProps['onNodeMouseLeave'];
+ onNodeContextMenu: NodeRendererProps['onNodeContextMenu'];
+ onNodeDoubleClick: NodeRendererProps['onNodeDoubleClick'];
+ noDragClassName: NodeRendererProps['noDragClassName'];
+ noPanClassName: NodeRendererProps['noPanClassName'];
+ rfId: NodeRendererProps['rfId'];
+ disableKeyboardA11y: NodeRendererProps['disableKeyboardA11y'];
+ resizeObserver: ResizeObserver | null;
+ nodesDraggable: boolean;
+ nodesConnectable: boolean;
+ nodesFocusable: boolean;
+ elementsSelectable: boolean;
+ onError: ReactFlowState['onError'];
+}) {
+ const node = useStore((s) => s.nodeLookup.get(props.id));
+ if (!node) return null;
+
+ let nodeType = node.type || 'default';
+
+ if (!props.nodeTypes[nodeType]) {
+ props.onError?.('003', errorMessages['error003'](nodeType));
+
+ nodeType = 'default';
+ }
+
+ const NodeComponent = (props.nodeTypes[nodeType] || props.nodeTypes.default) as ComponentType;
+ const isDraggable = !!(node.draggable || (props.nodesDraggable && typeof node.draggable === 'undefined'));
+ const isSelectable = !!(node.selectable || (props.elementsSelectable && typeof node.selectable === 'undefined'));
+ const isConnectable = !!(node.connectable || (props.nodesConnectable && typeof node.connectable === 'undefined'));
+ const isFocusable = !!(node.focusable || (props.nodesFocusable && typeof node.focusable === 'undefined'));
+
+ const clampedPosition = props.nodeExtent
+ ? clampPosition(node.computed?.positionAbsolute, props.nodeExtent)
+ : node.computed?.positionAbsolute;
+
+ const posX = clampedPosition?.x ?? 0;
+ const posY = clampedPosition?.y ?? 0;
+ const posOrigin = getPositionWithOrigin({
+ x: posX,
+ y: posY,
+ width: node.computed?.width ?? node.width ?? 0,
+ height: node.computed?.height ?? node.height ?? 0,
+ origin: node.origin || props.nodeOrigin,
+ });
+ const initialized = (!!node.computed?.width && !!node.computed?.height) || (!!node.width && !!node.height);
+
+ return (
+
+ );
+});
+
NodeRenderer.displayName = 'NodeRenderer';
export default memo(NodeRenderer);