Меня смущает оптимизация повторного рендеринга в контексте реакции. Это фактически предотвращает повторную визуализацию подписчика контекста?

Согласно React doc, useMemo и useCallback помогают оптимизировать производительность, потому что сравнение между рендерингом работает правильно.

Насколько я понимаю, однако, всякий раз, когда родительский компонент перерисовывается, его дочерние компоненты также перерисовываются. Поскольку контекст реакции работает с провайдером, все подписчики контекста находятся под родительским провайдером. Таким образом, повторный рендеринг родительского провайдера, вероятно, также вызывает повторный рендеринг дочернего.

Заявление ниже React doc меня смущает. Кто-нибудь может это объяснить?

даже если MyApp потребуется повторная визуализация, компонентам, вызывающим useContext(AuthContext), не потребуется повторная визуализация.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько я понимаю, однако, всякий раз, когда родительский компонент перерисовывается, его дочерние компоненты также перерисовываются.

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

Например, документация, на которую вы ссылаетесь, MyApp возвращает следующее:

const MyApp = () => {
  // ...
  return (
    <AuthContext.Provider value = {contextValue}>
      <Page />
    </AuthContext.Provider>
  );
}

Предположим, что Page реализовано примерно так:

import { memo } from 'react';

const Page = memo(() => {
  return (
    <ChildThatUsesContext />
  )
})

const ChildThatUsesContext = () => {
  const value = useContext(AuthContext);

  // ... do stuff
}

Если MyApp перерисовывается, а contextValue не меняется, то и Page, и ChildThatUsesContext могут пропустить рендеринг.

Если MyApp перерендерится, а contextValue действительно изменится, то Page сможет пропустить рендеринг, но ChildThatUsesContext (и все его потомки) придется рендерить, потому что он вызвал useContext(AuthContext);

Таким образом, причина запоминать contextValue состоит в том, чтобы чаще помещать нас в этот первый случай, когда все компоненты пропускают рендеринг, а не только Page.

Ага, понятно. За кулисами есть React.memo.

iamippei 31.03.2023 17:59

Другие вопросы по теме