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
+1 -1
View File
@@ -27,7 +27,7 @@
}, },
"..": { "..": {
"name": "react-flow-renderer", "name": "react-flow-renderer",
"version": "10.3.13", "version": "10.3.14",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.18.9", "@babel/runtime": "^7.18.9",
+1 -1
View File
@@ -117,7 +117,7 @@ const CustomNodeFlow = () => {
connectionLineStyle={connectionLineStyle} connectionLineStyle={connectionLineStyle}
snapToGrid={true} snapToGrid={true}
snapGrid={snapGrid} snapGrid={snapGrid}
defaultZoom={0.3} fitView
minZoom={0.3} minZoom={0.3}
maxZoom={2} maxZoom={2}
> >
+1 -1
View File
@@ -86,7 +86,7 @@ const UseZoomPanHelperFlow = () => {
const logNodes = useCallback(() => { const logNodes = useCallback(() => {
console.log('nodes', getNodes()); console.log('nodes', getNodes());
console.log('edges', getEdges()); console.log('edges', getEdges());
}, [getNodes]); }, [getNodes, getEdges]);
useEffect(() => { useEffect(() => {
addEdges({ id: 'e3-4', source: '3', target: '4' }); addEdges({ id: 'e3-4', source: '3', target: '4' });
+16 -15
View File
@@ -1,4 +1,4 @@
import { useCallback } from 'react'; import { useCallback, useMemo } from 'react';
import useViewportHelper from './useViewportHelper'; import useViewportHelper from './useViewportHelper';
import { useStoreApi } from '../store'; import { useStoreApi } from '../store';
@@ -14,7 +14,7 @@ import {
} from '../types'; } from '../types';
export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlowInstance<NodeData, EdgeData> { export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlowInstance<NodeData, EdgeData> {
const { initialized: viewportInitialized, ...viewportHelperFunctions } = useViewportHelper(); const viewportHelper = useViewportHelper();
const store = useStoreApi(); const store = useStoreApi();
const getNodes = useCallback<Instance.GetNodes<NodeData>>(() => { const getNodes = useCallback<Instance.GetNodes<NodeData>>(() => {
@@ -110,17 +110,18 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
}; };
}, []); }, []);
return { return useMemo(() => {
...viewportHelperFunctions, return {
viewportInitialized, ...viewportHelper,
getNodes, getNodes,
getNode, getNode,
getEdges, getEdges,
getEdge, getEdge,
setNodes, setNodes,
setEdges, setEdges,
addNodes, addNodes,
addEdges, addEdges,
toObject, 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) => {}, setCenter: (_: number, __: number) => {},
fitBounds: (_: Rect) => {}, fitBounds: (_: Rect) => {},
project: (position: XYPosition) => position, project: (position: XYPosition) => position,
initialized: false, viewportInitialized: false,
}; };
const selector = (s: ReactFlowState) => ({ const selector = (s: ReactFlowState) => ({
@@ -71,7 +71,7 @@ const useViewportHelper = (): ViewportHelperFunctions => {
const { transform, snapToGrid, snapGrid } = store.getState(); const { transform, snapToGrid, snapGrid } = store.getState();
return pointToRendererPoint(position, transform, snapToGrid, snapGrid); return pointToRendererPoint(position, transform, snapToGrid, snapGrid);
}, },
initialized: true, viewportInitialized: true,
}; };
} }
+1 -1
View File
@@ -130,7 +130,7 @@ export interface ViewportHelperFunctions {
setCenter: SetCenter; setCenter: SetCenter;
fitBounds: FitBounds; fitBounds: FitBounds;
project: Project; project: Project;
initialized: boolean; viewportInitialized: boolean;
} }
export type ReactFlowStore = { export type ReactFlowStore = {