refactor(react): reduce initial store.setState calls
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user