fix(useReactFlow): prevent unnecessary re-renderings

This commit is contained in:
moklick
2022-08-16 12:44:47 +02:00
parent 196f225aac
commit bb00e871c0
6 changed files with 22 additions and 21 deletions
+16 -15
View File
@@ -1,4 +1,4 @@
import { useCallback } from 'react';
import { useCallback, useMemo } from 'react';
import useViewportHelper from './useViewportHelper';
import { useStoreApi } from '../store';
@@ -14,7 +14,7 @@ import {
} from '../types';
export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlowInstance<NodeData, EdgeData> {
const { initialized: viewportInitialized, ...viewportHelperFunctions } = useViewportHelper();
const viewportHelper = useViewportHelper();
const store = useStoreApi();
const getNodes = useCallback<Instance.GetNodes<NodeData>>(() => {
@@ -110,17 +110,18 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
};
}, []);
return {
...viewportHelperFunctions,
viewportInitialized,
getNodes,
getNode,
getEdges,
getEdge,
setNodes,
setEdges,
addNodes,
addEdges,
toObject,
};
return useMemo(() => {
return {
...viewportHelper,
getNodes,
getNode,
getEdges,
getEdge,
setNodes,
setEdges,
addNodes,
addEdges,
toObject,
};
}, [viewportHelper, getNodes, getNode, getEdges, getEdge, setNodes, setEdges, addNodes, addEdges, toObject]);
}
+2 -2
View File
@@ -20,7 +20,7 @@ const initialViewportHelper: ViewportHelperFunctions = {
setCenter: (_: number, __: number) => {},
fitBounds: (_: Rect) => {},
project: (position: XYPosition) => position,
initialized: false,
viewportInitialized: false,
};
const selector = (s: ReactFlowState) => ({
@@ -71,7 +71,7 @@ const useViewportHelper = (): ViewportHelperFunctions => {
const { transform, snapToGrid, snapGrid } = store.getState();
return pointToRendererPoint(position, transform, snapToGrid, snapGrid);
},
initialized: true,
viewportInitialized: true,
};
}
+1 -1
View File
@@ -130,7 +130,7 @@ export interface ViewportHelperFunctions {
setCenter: SetCenter;
fitBounds: FitBounds;
project: Project;
initialized: boolean;
viewportInitialized: boolean;
}
export type ReactFlowStore = {