refactor(react): reduce initial store.setState calls

This commit is contained in:
moklick
2023-12-19 11:13:48 +01:00
parent 069668ab61
commit 66b5c95ac5
9 changed files with 34 additions and 27 deletions
@@ -34,7 +34,6 @@ function EdgeWrapper({
onEdgeUpdateEnd, onEdgeUpdateEnd,
rfId, rfId,
edgeTypes, edgeTypes,
elevateEdgesOnSelect,
noPanClassName, noPanClassName,
onError, onError,
}: EdgeWrapperProps): JSX.Element | null { }: EdgeWrapperProps): JSX.Element | null {
@@ -90,7 +89,7 @@ function EdgeWrapper({
zIndex: edge.zIndex, zIndex: edge.zIndex,
sourceNode, sourceNode,
targetNode, targetNode,
elevateOnSelect: elevateEdgesOnSelect, elevateOnSelect: store.elevateEdgesOnSelect,
}); });
return { return {
@@ -98,7 +97,7 @@ function EdgeWrapper({
...(edgePosition || nullPosition), ...(edgePosition || nullPosition),
}; };
}, },
[edge.source, edge.target, edge.selected, edge.zIndex, elevateEdgesOnSelect] [edge.source, edge.target, edge.selected, edge.zIndex]
), ),
shallow shallow
); );
@@ -18,6 +18,7 @@ import { handleNodeClick } from '../Nodes/utils';
import type { NodeWrapperProps } from '../../types'; import type { NodeWrapperProps } from '../../types';
import { arrowKeyDiffs, builtinNodeTypes } from './utils'; import { arrowKeyDiffs, builtinNodeTypes } from './utils';
import { shallow } from 'zustand/shallow'; import { shallow } from 'zustand/shallow';
const NodeWrapper = ({ const NodeWrapper = ({
id, id,
onClick, onClick,
@@ -5,10 +5,11 @@
*/ */
import { useEffect, useRef } from 'react'; import { useEffect, useRef } from 'react';
import { shallow } from 'zustand/shallow'; import { shallow } from 'zustand/shallow';
import { type CoordinateExtent } from '@xyflow/system'; import { infiniteExtent, type CoordinateExtent } from '@xyflow/system';
import { useStore, useStoreApi } from '../../hooks/useStore'; import { useStore, useStoreApi } from '../../hooks/useStore';
import type { Node, Edge, ReactFlowState, ReactFlowProps, FitViewOptions } from '../../types'; import type { Node, Edge, ReactFlowState, ReactFlowProps, FitViewOptions } from '../../types';
import { initNodeOrigin } from '../../container/ReactFlow';
// these fields exist in the global store and we need to keep them up to date // these fields exist in the global store and we need to keep them up to date
const reactFlowFieldsToTrack = [ const reactFlowFieldsToTrack = [
@@ -27,6 +28,7 @@ const reactFlowFieldsToTrack = [
'edgesFocusable', 'edgesFocusable',
'edgesUpdatable', 'edgesUpdatable',
'elevateNodesOnSelect', 'elevateNodesOnSelect',
'elevateEdgesOnSelect',
'minZoom', 'minZoom',
'maxZoom', 'maxZoom',
'nodeExtent', 'nodeExtent',
@@ -103,7 +105,18 @@ const StoreUpdater = (props: StoreUpdaterProps) => {
}; };
}, []); }, []);
const previousFields = useRef<Partial<StoreUpdaterProps>>({}); const previousFields = useRef<Partial<StoreUpdaterProps>>({
// these are values that are also passed directly to other components
// than the StoreUpdater. We can reduce the number of setStore calls
// by setting the same values here as prev fields.
translateExtent: infiniteExtent,
nodeOrigin: initNodeOrigin,
minZoom: 0.5,
maxZoom: 2,
elementsSelectable: true,
noPanClassName: 'nopan',
rfId: '1',
});
useEffect( useEffect(
() => { () => {
@@ -23,7 +23,6 @@ type EdgeRendererProps = Pick<
| 'onEdgeUpdateEnd' | 'onEdgeUpdateEnd'
| 'edgeUpdaterRadius' | 'edgeUpdaterRadius'
| 'noPanClassName' | 'noPanClassName'
| 'elevateEdgesOnSelect'
| 'rfId' | 'rfId'
| 'disableKeyboardA11y' | 'disableKeyboardA11y'
| 'edgeTypes' | 'edgeTypes'
@@ -44,7 +43,6 @@ const selector = (s: ReactFlowState) => ({
const EdgeRenderer = ({ const EdgeRenderer = ({
defaultMarkerColor, defaultMarkerColor,
onlyRenderVisibleElements, onlyRenderVisibleElements,
elevateEdgesOnSelect,
rfId, rfId,
edgeTypes, edgeTypes,
noPanClassName, noPanClassName,
@@ -89,7 +87,6 @@ const EdgeRenderer = ({
rfId={rfId} rfId={rfId}
onError={onError} onError={onError}
edgeTypes={edgeTypes} edgeTypes={edgeTypes}
elevateEdgesOnSelect={elevateEdgesOnSelect}
/> />
); );
})} })}
@@ -12,7 +12,7 @@ import useNodeOrEdgeTypesWarning from './useNodeOrEdgeTypesWarning';
export type GraphViewProps = Omit< export type GraphViewProps = Omit<
ReactFlowProps, ReactFlowProps,
'onSelectionChange' | 'nodes' | 'edges' | 'onMove' | 'onMoveStart' | 'onMoveEnd' 'onSelectionChange' | 'nodes' | 'edges' | 'onMove' | 'onMoveStart' | 'onMoveEnd' | 'elevateEdgesOnSelect'
> & > &
Required< Required<
Pick< Pick<
@@ -96,7 +96,6 @@ const GraphView = ({
noDragClassName, noDragClassName,
noWheelClassName, noWheelClassName,
noPanClassName, noPanClassName,
elevateEdgesOnSelect,
disableKeyboardA11y, disableKeyboardA11y,
nodeOrigin, nodeOrigin,
nodeExtent, nodeExtent,
@@ -164,7 +163,6 @@ const GraphView = ({
edgeUpdaterRadius={edgeUpdaterRadius} edgeUpdaterRadius={edgeUpdaterRadius}
defaultMarkerColor={defaultMarkerColor} defaultMarkerColor={defaultMarkerColor}
noPanClassName={noPanClassName} noPanClassName={noPanClassName}
elevateEdgesOnSelect={!!elevateEdgesOnSelect}
disableKeyboardA11y={disableKeyboardA11y} disableKeyboardA11y={disableKeyboardA11y}
rfId={rfId} rfId={rfId}
> >
@@ -2,7 +2,6 @@ import { forwardRef, type CSSProperties } from 'react';
import cc from 'classcat'; import cc from 'classcat';
import { import {
ConnectionLineType, ConnectionLineType,
ConnectionMode,
PanOnScrollMode, PanOnScrollMode,
SelectionMode, SelectionMode,
infiniteExtent, infiniteExtent,
@@ -21,8 +20,7 @@ import Wrapper from './Wrapper';
import type { ReactFlowProps, ReactFlowRefType } from '../../types'; import type { ReactFlowProps, ReactFlowRefType } from '../../types';
import useColorModeClass from '../../hooks/useColorModeClass'; import useColorModeClass from '../../hooks/useColorModeClass';
const initNodeOrigin: NodeOrigin = [0, 0]; export const initNodeOrigin: NodeOrigin = [0, 0];
const initSnapGrid: [number, number] = [15, 15];
const initDefaultViewport: Viewport = { x: 0, y: 0, zoom: 1 }; const initDefaultViewport: Viewport = { x: 0, y: 0, zoom: 1 };
const wrapperStyle: CSSProperties = { const wrapperStyle: CSSProperties = {
@@ -72,7 +70,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
onSelectionContextMenu, onSelectionContextMenu,
onSelectionStart, onSelectionStart,
onSelectionEnd, onSelectionEnd,
connectionMode = ConnectionMode.Strict, connectionMode,
connectionLineType = ConnectionLineType.Bezier, connectionLineType = ConnectionLineType.Bezier,
connectionLineStyle, connectionLineStyle,
connectionLineComponent, connectionLineComponent,
@@ -84,10 +82,10 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
panActivationKeyCode = 'Space', panActivationKeyCode = 'Space',
multiSelectionKeyCode = isMacOs() ? 'Meta' : 'Control', multiSelectionKeyCode = isMacOs() ? 'Meta' : 'Control',
zoomActivationKeyCode = isMacOs() ? 'Meta' : 'Control', zoomActivationKeyCode = isMacOs() ? 'Meta' : 'Control',
snapToGrid = false, snapToGrid,
snapGrid = initSnapGrid, snapGrid,
onlyRenderVisibleElements = false, onlyRenderVisibleElements = false,
selectNodesOnDrag = true, selectNodesOnDrag,
nodesDraggable, nodesDraggable,
nodesConnectable, nodesConnectable,
nodesFocusable, nodesFocusable,
@@ -130,18 +128,18 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
noDragClassName = 'nodrag', noDragClassName = 'nodrag',
noWheelClassName = 'nowheel', noWheelClassName = 'nowheel',
noPanClassName = 'nopan', noPanClassName = 'nopan',
fitView = false, fitView,
fitViewOptions, fitViewOptions,
connectOnClick = true, connectOnClick,
attributionPosition, attributionPosition,
proOptions, proOptions,
defaultEdgeOptions, defaultEdgeOptions,
elevateNodesOnSelect = true, elevateNodesOnSelect,
elevateEdgesOnSelect = false, elevateEdgesOnSelect,
disableKeyboardA11y = false, disableKeyboardA11y = false,
autoPanOnConnect = true, autoPanOnConnect,
autoPanOnNodeDrag = true, autoPanOnNodeDrag,
connectionRadius = 20, connectionRadius,
isValidConnection, isValidConnection,
onError, onError,
style, style,
@@ -226,7 +224,6 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
noDragClassName={noDragClassName} noDragClassName={noDragClassName}
noWheelClassName={noWheelClassName} noWheelClassName={noWheelClassName}
noPanClassName={noPanClassName} noPanClassName={noPanClassName}
elevateEdgesOnSelect={elevateEdgesOnSelect}
rfId={rfId} rfId={rfId}
disableKeyboardA11y={disableKeyboardA11y} disableKeyboardA11y={disableKeyboardA11y}
nodeOrigin={nodeOrigin} nodeOrigin={nodeOrigin}
@@ -251,6 +248,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
edgesUpdatable={edgesUpdatable} edgesUpdatable={edgesUpdatable}
elementsSelectable={elementsSelectable} elementsSelectable={elementsSelectable}
elevateNodesOnSelect={elevateNodesOnSelect} elevateNodesOnSelect={elevateNodesOnSelect}
elevateEdgesOnSelect={elevateEdgesOnSelect}
minZoom={minZoom} minZoom={minZoom}
maxZoom={maxZoom} maxZoom={maxZoom}
nodeExtent={nodeExtent} nodeExtent={nodeExtent}
+1
View File
@@ -83,6 +83,7 @@ const getInitialState = ({
edgesUpdatable: true, edgesUpdatable: true,
elementsSelectable: true, elementsSelectable: true,
elevateNodesOnSelect: true, elevateNodesOnSelect: true,
elevateEdgesOnSelect: false,
fitViewOnInit: false, fitViewOnInit: false,
fitViewDone: false, fitViewDone: false,
fitViewOnInitOptions: undefined, fitViewOnInitOptions: undefined,
-1
View File
@@ -78,7 +78,6 @@ export type EdgeWrapperProps = {
rfId?: string; rfId?: string;
edgeTypes?: EdgeTypes; edgeTypes?: EdgeTypes;
onError?: OnError; onError?: OnError;
elevateEdgesOnSelect?: boolean;
}; };
export type DefaultEdgeOptions = DefaultEdgeOptionsBase<Edge>; export type DefaultEdgeOptions = DefaultEdgeOptionsBase<Edge>;
+1
View File
@@ -88,6 +88,7 @@ export type ReactFlowStore = {
edgesUpdatable: boolean; edgesUpdatable: boolean;
elementsSelectable: boolean; elementsSelectable: boolean;
elevateNodesOnSelect: boolean; elevateNodesOnSelect: boolean;
elevateEdgesOnSelect: boolean;
selectNodesOnDrag: boolean; selectNodesOnDrag: boolean;
multiSelectionActive: boolean; multiSelectionActive: boolean;