From 578016c44d6181febdd19a9b2846ace5e148294e Mon Sep 17 00:00:00 2001 From: Chris Dhanaraj Date: Tue, 18 Aug 2020 19:16:03 -0700 Subject: [PATCH 1/2] memoize the wrappedReducer function --- src/index.tsx | 111 +++++++++++++++++++++++++++----------------------- 1 file changed, 59 insertions(+), 52 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 3418184..b18a755 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -181,63 +181,70 @@ export function useEffectReducer< effectsMap?: EffectsMap ): [TState, React.Dispatch] { const entitiesRef = useRef>>(new Set()); - const wrappedReducer = ( - [state, stateEffectTuples, entitiesToStop]: AggregatedEffectsState< - TState, - TEvent - >, - event: TEvent | FlushEvent - ): AggregatedEffectsState => { - const nextEffectEntities: Array> = []; - const nextEntitiesToStop: Array> = []; - - if (event.type === flushEffectsSymbol) { - // Record that effects have already been executed - return [state, stateEffectTuples.slice(event.count), nextEntitiesToStop]; - } - - const exec = ( - effect: TEffect | EffectFunction - ) => { - const effectObject = toEffectObject(effect, effectsMap); - const effectEntity = createEffectEntity( - effectObject - ); - nextEffectEntities.push(effectEntity); + const wrappedReducer = useMemo( + () => ( + [state, stateEffectTuples, entitiesToStop]: AggregatedEffectsState< + TState, + TEvent + >, + event: TEvent | FlushEvent + ): AggregatedEffectsState => { + const nextEffectEntities: Array> = []; + const nextEntitiesToStop: Array> = []; + + if (event.type === flushEffectsSymbol) { + // Record that effects have already been executed + return [ + state, + stateEffectTuples.slice(event.count), + nextEntitiesToStop, + ]; + } - return effectEntity; - }; + const exec = ( + effect: TEffect | EffectFunction + ) => { + const effectObject = toEffectObject(effect, effectsMap); + const effectEntity = createEffectEntity( + effectObject + ); + nextEffectEntities.push(effectEntity); - exec.stop = (entity: EffectEntity) => { - nextEntitiesToStop.push(entity); - }; + return effectEntity; + }; - exec.replace = ( - entity: EffectEntity, - effect: TEffect | EffectFunction - ) => { - if (entity) { + exec.stop = (entity: EffectEntity) => { nextEntitiesToStop.push(entity); - } - return exec(effect); - }; + }; + + exec.replace = ( + entity: EffectEntity, + effect: TEffect | EffectFunction + ) => { + if (entity) { + nextEntitiesToStop.push(entity); + } + return exec(effect); + }; - const nextState = effectReducer( - state, - event, - exec as EffectReducerExec - ); - - return [ - nextState, - nextEffectEntities.length - ? [...stateEffectTuples, [nextState, nextEffectEntities]] - : stateEffectTuples, - entitiesToStop.length - ? [...entitiesToStop, ...nextEntitiesToStop] - : nextEntitiesToStop, - ]; - }; + const nextState = effectReducer( + state, + event, + exec as EffectReducerExec + ); + + return [ + nextState, + nextEffectEntities.length + ? [...stateEffectTuples, [nextState, nextEffectEntities]] + : stateEffectTuples, + entitiesToStop.length + ? [...entitiesToStop, ...nextEntitiesToStop] + : nextEntitiesToStop, + ]; + }, + [] + ); const initialStateAndEffects: AggregatedEffectsState< TState, From f82ad474ca888c906172edc537370f58d20da6c1 Mon Sep 17 00:00:00 2001 From: David Khourshid Date: Tue, 1 Dec 2020 17:27:49 -0500 Subject: [PATCH 2/2] Update src/index.tsx Co-authored-by: Ross Allen --- src/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.tsx b/src/index.tsx index b18a755..1f793db 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -243,7 +243,7 @@ export function useEffectReducer< : nextEntitiesToStop, ]; }, - [] + [effectReducer, effectsMap] ); const initialStateAndEffects: AggregatedEffectsState<