При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после поставщика контекста. Это позволит избежать ненужных повторных рендеров.
Вот несколько примеров того, как повторное отображение работает с Context:
// App (ContextProvider) > A > B > C const App = () => { return ( <AppContext.Provider> <ComponentA /> </AppContext.Provider> ); }; const ComponentA = () => <ComponentB />; const ComponentB = () => <ComponentC />; const ComponentC = () => null;
В этом примере, если компонент App перерендерится, все компоненты внутри него также перерендерятся, независимо от того, изменились ли их реквизиты.
Чтобы предотвратить повторное отображение всех компонентов ComponentA, ComponentB и ComponentC при повторном отображении компонента App, вы можете использовать React.memo следующим образом:
// App (ContextProvider) const App = () => { return ( <AppContext.Provider> <ComponentA /> </AppContext.Provider> ); }; const ComponentA = React.memo(() => <ComponentB />); const ComponentB = () => <ComponentC />; const ComponentC = () => null;
// App (ContextProvider) -> C const App = () => { const value = {a: 'hi', b: 'bye'}; return ( <AppContext.Provider value = {value}> <ComponentA /> </AppContext.Provider> ); }; const ComponentA = React.memo(() => <ComponentB />); const ComponentB = () => <ComponentC />; const ComponentC = () => { const contextValue = useContext(AppContext); return null; };
В этом примере, несмотря на то, что значение провайдера не меняется, компонентС перерисовывается. Это происходит потому, что в JavaScript истинно следующее утверждение:
{a: 'hi', b: 'bye'} !== {a: 'hi', b: 'bye'}.
Проблема в примере 3 может быть решена с помощью хука useMemo из React следующим образом.
// App (ContextProvider) const App = () => { const a = 'hi'; const b = 'bye'; const value = useMemo(() => ({a, b}), [a, b]); return ( <AppContext.Provider value = {value}> <ComponentA /> </AppContext.Provider> ); }; const ComponentA = React.memo(() => <ComponentB />); const ComponentB = () => <ComponentC />; const ComponentC = () => { const contextValue = useContext(AppContext); return null; };
При такой реализации, если приложение повторно рендерится по любой другой причине, которая не изменяет ни одно из значений 'a' или 'b', последовательность повторных рендерингов будет следующей:
App (ContextProvider)
Это приводит к желаемому результату, позволяя избежать ненужного повторного рендеринга ComponentC. Благодаря использованию useMemo гарантируется одинаковая ссылка на объект для переменной value. Поскольку этой переменной присваивается значение провайдера, контекст определяется как неизменный, и потребители не уведомляются.
В этой статье блога представлена информация об оптимизации рендеринга при использовании компонентов React с Context с помощью React.memo. Она включает примеры того, как повторный рендеринг работает с Context и как предотвратить ненужный повторный рендеринг с помощью React.memo.
19.03.2023 13:43
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем запускать наши php-файлы через localhost на наших компьютерах. Мне с трудом удалось установить его и я решил поделиться этой статьей, чтобы помочь тем,...
19.03.2023 11:50
Лично я попрощался с операторами print() в python. Без шуток.
19.03.2023 06:15
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они постоянно обновляют версию (а нам нужно быстро наверстать упущенное!).
18.03.2023 11:32
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
18.03.2023 11:16
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки наряду с HTML и JavaScript.
18.03.2023 10:52
Это была невероятная первая неделя в качестве стипендиата Bytewise Frontend Development Fellow, и я очень рад поделиться со всеми вами всем тем, чему я научился!