refactor(edgeWrapper): memoize onConnectEdge func
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import React, { memo, CSSProperties } from 'react';
|
import React, { memo, CSSProperties, useCallback } from 'react';
|
||||||
|
|
||||||
import { useStoreState } from '../../store/hooks';
|
import { useStoreState } from '../../store/hooks';
|
||||||
import ConnectionLine from '../../components/ConnectionLine/index';
|
import ConnectionLine from '../../components/ConnectionLine/index';
|
||||||
@@ -29,21 +29,40 @@ interface EdgeRendererProps {
|
|||||||
onEdgeUpdate?: OnEdgeUpdateFunc;
|
onEdgeUpdate?: OnEdgeUpdateFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderEdge(
|
interface EdgeWrapperProps {
|
||||||
edge: Edge,
|
edge: Edge;
|
||||||
props: EdgeRendererProps,
|
props: EdgeRendererProps;
|
||||||
nodes: Node[],
|
nodes: Node[];
|
||||||
selectedElements: Elements | null,
|
selectedElements: Elements | null;
|
||||||
elementsSelectable: boolean,
|
elementsSelectable: boolean;
|
||||||
transform: Transform,
|
transform: Transform;
|
||||||
width: number,
|
width: number;
|
||||||
height: number,
|
height: number;
|
||||||
onlyRenderVisibleElements: boolean
|
onlyRenderVisibleElements: boolean;
|
||||||
) {
|
}
|
||||||
|
|
||||||
|
const Edge = ({
|
||||||
|
edge,
|
||||||
|
props,
|
||||||
|
nodes,
|
||||||
|
selectedElements,
|
||||||
|
elementsSelectable,
|
||||||
|
transform,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
onlyRenderVisibleElements,
|
||||||
|
}: EdgeWrapperProps) => {
|
||||||
const sourceHandleId = edge.sourceHandle || null;
|
const sourceHandleId = edge.sourceHandle || null;
|
||||||
const targetHandleId = edge.targetHandle || null;
|
const targetHandleId = edge.targetHandle || null;
|
||||||
const { sourceNode, targetNode } = getSourceTargetNodes(edge, nodes);
|
const { sourceNode, targetNode } = getSourceTargetNodes(edge, nodes);
|
||||||
|
|
||||||
|
const onConnectEdge = useCallback(
|
||||||
|
(connection: Connection) => {
|
||||||
|
props.onEdgeUpdate?.(edge, connection);
|
||||||
|
},
|
||||||
|
[edge]
|
||||||
|
);
|
||||||
|
|
||||||
if (!sourceNode) {
|
if (!sourceNode) {
|
||||||
console.warn(`couldn't create edge for source id: ${edge.source}; edge id: ${edge.id}`);
|
console.warn(`couldn't create edge for source id: ${edge.source}; edge id: ${edge.id}`);
|
||||||
return null;
|
return null;
|
||||||
@@ -100,10 +119,6 @@ function renderEdge(
|
|||||||
|
|
||||||
const isSelected = selectedElements?.some((elm) => isEdge(elm) && elm.id === edge.id) || false;
|
const isSelected = selectedElements?.some((elm) => isEdge(elm) && elm.id === edge.id) || false;
|
||||||
|
|
||||||
const onConnectEdge = (connection: Connection) => {
|
|
||||||
props.onEdgeUpdate?.(edge, connection);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<EdgeComponent
|
<EdgeComponent
|
||||||
key={edge.id}
|
key={edge.id}
|
||||||
@@ -139,7 +154,7 @@ function renderEdge(
|
|||||||
handleEdgeUpdate={typeof props.onEdgeUpdate !== 'undefined'}
|
handleEdgeUpdate={typeof props.onEdgeUpdate !== 'undefined'}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
const EdgeRenderer = (props: EdgeRendererProps) => {
|
const EdgeRenderer = (props: EdgeRendererProps) => {
|
||||||
const transform = useStoreState((state) => state.transform);
|
const transform = useStoreState((state) => state.transform);
|
||||||
@@ -173,19 +188,20 @@ const EdgeRenderer = (props: EdgeRendererProps) => {
|
|||||||
<svg width={width} height={height} className="react-flow__edges">
|
<svg width={width} height={height} className="react-flow__edges">
|
||||||
<MarkerDefinitions color={arrowHeadColor} />
|
<MarkerDefinitions color={arrowHeadColor} />
|
||||||
<g transform={transformStyle}>
|
<g transform={transformStyle}>
|
||||||
{edges.map((edge: Edge) =>
|
{edges.map((edge: Edge) => (
|
||||||
renderEdge(
|
<Edge
|
||||||
edge,
|
key={edge.id}
|
||||||
props,
|
edge={edge}
|
||||||
nodes,
|
props={props}
|
||||||
selectedElements,
|
nodes={nodes}
|
||||||
elementsSelectable,
|
selectedElements={selectedElements}
|
||||||
transform,
|
elementsSelectable={elementsSelectable}
|
||||||
width,
|
transform={transform}
|
||||||
height,
|
width={width}
|
||||||
onlyRenderVisibleElements
|
height={height}
|
||||||
)
|
onlyRenderVisibleElements={onlyRenderVisibleElements}
|
||||||
)}
|
/>
|
||||||
|
))}
|
||||||
{renderConnectionLine && (
|
{renderConnectionLine && (
|
||||||
<ConnectionLine
|
<ConnectionLine
|
||||||
nodes={nodes}
|
nodes={nodes}
|
||||||
|
|||||||
Reference in New Issue
Block a user