Оптимизация React Context шаг за шагом в 4 примерах

RedDeveloper
19.03.2023 13:03
Оптимизация React Context шаг за шагом в 4 примерах

При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после поставщика контекста. Это позволит избежать ненужных повторных рендеров.

Вот несколько примеров того, как повторное отображение работает с Context:

Пример 1:

// App (ContextProvider) > A > B > C

const App = () => {
return (
   <AppContext.Provider>
     <ComponentA />
   </AppContext.Provider>
 );
};

const ComponentA = () => <ComponentB />;
const ComponentB = () => <ComponentC />;
const ComponentC = () => null;

В этом примере, если компонент App перерендерится, все компоненты внутри него также перерендерятся, независимо от того, изменились ли их реквизиты.

Пример 2:

Чтобы предотвратить повторное отображение всех компонентов 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;

Пример 3:

// 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'}.

Пример 4:

Проблема в примере 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.

Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы

19.03.2023 13:43

Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем запускать наши php-файлы через localhost на наших компьютерах. Мне с трудом удалось установить его и я решил поделиться этой статьей, чтобы помочь тем,...

Библиотека для работы с мороженым
Библиотека для работы с мороженым

19.03.2023 11:50

Лично я попрощался с операторами print() в python. Без шуток.

Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp

19.03.2023 06:15

Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они постоянно обновляют версию (а нам нужно быстро наверстать упущенное!).

Уроки CSS 6
Уроки CSS 6

18.03.2023 11:32

Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.

Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?

18.03.2023 11:16

CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки наряду с HTML и JavaScript.

Погружение в HTML и инструменты торговли
Погружение в HTML и инструменты торговли

18.03.2023 10:52

Это была невероятная первая неделя в качестве стипендиата Bytewise Frontend Development Fellow, и я очень рад поделиться со всеми вами всем тем, чему я научился!