Skip to content

Commit

Permalink
Use memo for AppRootContext value (#7667)
Browse files Browse the repository at this point in the history
Выяснилось, что если AppRoot по какой-то причине ререндерится, то это вызывает ререндер компонентов, основанных на Tappable/Clickable компонентах, даже если они обернуты в React.memo.
Виной тому пересоздающийся объект контекста.

Когда может ререндерится AppRoot?
Например, когда он обернут в компонент, который слушает изменения стора, бывает нужно для того, чтобы менять тему самого AppRoot. Тогда получается, что каждое обновление стора вызывает ререндер AppRoot и компонентов VKUI.
  • Loading branch information
andrey-medvedev-vk authored Sep 27, 2024
1 parent f0f463c commit 3ab56f7
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions packages/vkui/src/components/AppRoot/AppRoot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -198,20 +198,23 @@ export const AppRoot = ({
[scroll],
);

const contextValue = React.useMemo(
() => ({
appRoot: appRootRef,
portalRoot: portalRootRef,
embedded: mode === 'embedded',
mode,
disablePortal,
layout,
get keyboardInput() {
return isKeyboardInputActiveRef.current;
},
}),
[disablePortal, isKeyboardInputActiveRef, layout, mode],
);

const content = (
<AppRootContext.Provider
value={{
appRoot: appRootRef,
portalRoot: portalRootRef,
embedded: mode === 'embedded',
mode,
disablePortal,
layout,
get keyboardInput() {
return isKeyboardInputActiveRef.current;
},
}}
>
<AppRootContext.Provider value={contextValue}>
<ScrollController elRef={appRootRef}>{children}</ScrollController>
</AppRootContext.Provider>
);
Expand Down

0 comments on commit 3ab56f7

Please sign in to comment.