ThisuseEffect will mount and execute on every single render. The root cause is that getCurrentDecision in useDecision is not wrapped in useCallback like it is in the other hooks.
const getCurrentDecision: () => { decision: OptimizelyDecision } = () => ({
decision: optimizely.decide(flagKey, options.decideOptions, overrides.overrideUserId, overrideAttrs),
});
...
useEffect(() => {
// Subscribe to update after first datafile is fetched and readyPromise is resolved to avoid redundant rendering.
if (optimizely.getIsReadyPromiseFulfilled() && options.autoUpdate) {
return setupAutoUpdateListeners(optimizely, HookType.FEATURE, flagKey, hooksLogger, () => {
setState(prevState => ({
...prevState,
...getCurrentDecision(),
}));
});
}
return (): void => { };
}, [optimizely.getIsReadyPromiseFulfilled(), options.autoUpdate, optimizely, flagKey, getCurrentDecision]);
This
useEffect
will mount and execute on every single render. The root cause is thatgetCurrentDecision
inuseDecision
is not wrapped inuseCallback
like it is in the other hooks.