Skip to content

Commit

Permalink
refactor(GraphView): reduce amounts of re-renderings
Browse files Browse the repository at this point in the history
  • Loading branch information
moklick committed Nov 9, 2020
1 parent d06868e commit 0fbefe5
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import { useEffect } from 'react';
import isEqual from 'fast-deep-equal';

import { useStoreState, useStoreActions } from '../store/hooks';
import { parseElement, isNode, isEdge } from '../utils/graph';
import { Elements, Node, Edge, FlowElement } from '../types';
import { useStoreState, useStoreActions } from '../../store/hooks';
import { parseElement, isNode, isEdge } from '../../utils/graph';
import { Elements, Node, Edge, FlowElement } from '../../types';

const useElementUpdater = (propElements: Elements): void => {
interface ElementUpdaterProps {
elements: Elements;
}

const ElementUpdater = ({ elements }: ElementUpdaterProps) => {
const stateElements = useStoreState((state) => state.elements);
const setElements = useStoreActions((actions) => actions.setElements);

useEffect(() => {
const nextElements: Elements = propElements.map((propElement) => {
const nextElements: Elements = elements.map((propElement) => {
const existingElement = stateElements.find((el) => el.id === propElement.id?.toString());

if (existingElement) {
Expand Down Expand Up @@ -137,7 +141,9 @@ const useElementUpdater = (propElements: Elements): void => {
if (elementsChanged) {
setElements(nextElements);
}
}, [propElements, stateElements]);
}, [elements, stateElements]);

return null;
};

export default useElementUpdater;
export default ElementUpdater;
6 changes: 1 addition & 5 deletions src/container/GraphView/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@ import { useStoreActions, useStore } from '../../store/hooks';
import FlowRenderer from '../FlowRenderer';
import NodeRenderer from '../NodeRenderer';
import EdgeRenderer from '../EdgeRenderer';
import useElementUpdater from '../../hooks/useElementUpdater';
import { onLoadProject, onLoadGetElements, onLoadToObject } from '../../utils/graph';
import useZoomPanHelper from '../../hooks/useZoomPanHelper';

import { ReactFlowProps } from '../ReactFlow';

import { NodeTypesType, EdgeTypesType, ConnectionLineType } from '../../types';

export interface GraphViewProps extends Omit<ReactFlowProps, 'onSelectionChange'> {
export interface GraphViewProps extends Omit<ReactFlowProps, 'onSelectionChange' | 'elements'> {
nodeTypes: NodeTypesType;
edgeTypes: EdgeTypesType;
selectionKeyCode: number;
Expand Down Expand Up @@ -53,7 +52,6 @@ const GraphView = ({
multiSelectionKeyCode,
onElementsRemove,
deleteKeyCode,
elements,
onConnect,
onConnectStart,
onConnectStop,
Expand Down Expand Up @@ -97,8 +95,6 @@ const GraphView = ({
const currentStore = useStore();
const { zoomIn, zoomOut, zoomTo, transform, fitView } = useZoomPanHelper();

useElementUpdater(elements);

useEffect(() => {
if (!isInitialised.current && zoomIn && zoomOut && zoomTo && transform && fitView) {
if (onLoad) {
Expand Down
3 changes: 2 additions & 1 deletion src/container/ReactFlow/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ if (nodeEnv !== 'production') {
}

import GraphView from '../GraphView';
import ElementUpdater from '../../components/ElementUpdater';
import DefaultNode from '../../components/Nodes/DefaultNode';
import InputNode from '../../components/Nodes/InputNode';
import OutputNode from '../../components/Nodes/OutputNode';
Expand Down Expand Up @@ -189,7 +190,6 @@ const ReactFlow = ({
onElementsRemove={onElementsRemove}
deleteKeyCode={deleteKeyCode}
multiSelectionKeyCode={multiSelectionKeyCode}
elements={elements}
onConnect={onConnect}
onConnectStart={onConnectStart}
onConnectStop={onConnectStop}
Expand Down Expand Up @@ -221,6 +221,7 @@ const ReactFlow = ({
onSelectionDragStop={onSelectionDragStop}
onSelectionContextMenu={onSelectionContextMenu}
/>
<ElementUpdater elements={elements} />
{onSelectionChange && <SelectionListener onSelectionChange={onSelectionChange} />}
{children}
</Wrapper>
Expand Down
2 changes: 1 addition & 1 deletion src/container/ZoomPane/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ const ZoomPane = ({
const zoomPane = useRef<HTMLDivElement>(null);
const prevTransform = useRef<FlowTransform>({ x: 0, y: 0, zoom: 0 });

const store = useStore();
const d3Zoom = useStoreState((s) => s.d3Zoom);
const d3Selection = useStoreState((s) => s.d3Selection);
const d3ZoomHandler = useStoreState((s) => s.d3ZoomHandler);

const initD3Zoom = useStoreActions((actions) => actions.initD3Zoom);
const updateTransform = useStoreActions((actions) => actions.updateTransform);
const store = useStore();

useResizeHandler(zoomPane);

Expand Down
6 changes: 3 additions & 3 deletions src/hooks/useGlobalKeyHandler.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useEffect } from 'react';

import { useStoreState, useStoreActions } from '../store/hooks';
import { useStore, useStoreActions } from '../store/hooks';
import useKeyPress from './useKeyPress';
import { isNode, getConnectedEdges } from '../utils/graph';
import { Elements } from '../types';
Expand All @@ -12,8 +12,7 @@ interface HookParams {
}

export default ({ deleteKeyCode, multiSelectionKeyCode, onElementsRemove }: HookParams): void => {
const selectedElements = useStoreState((state) => state.selectedElements);
const edges = useStoreState((state) => state.edges);
const store = useStore();

const unsetNodesSelection = useStoreActions((actions) => actions.unsetNodesSelection);
const setMultiSelectionActive = useStoreActions((actions) => actions.setMultiSelectionActive);
Expand All @@ -23,6 +22,7 @@ export default ({ deleteKeyCode, multiSelectionKeyCode, onElementsRemove }: Hook
const multiSelectionKeyPressed = useKeyPress(multiSelectionKeyCode);

useEffect(() => {
const { edges, selectedElements } = store.getState();
if (onElementsRemove && deleteKeyPressed && selectedElements) {
let elementsToRemove = selectedElements;

Expand Down

0 comments on commit 0fbefe5

Please sign in to comment.