0Pricing
React Academy · Урок

Чистые компоненты и отказ от побочных эффектов при отрисовке

Пишите функции отрисовки без мутаций и чтения внешних данных

«Чистые компоненты и отказ от побочных эффектов при отрисовке» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Добро пожаловать

В этом уроке вы узнаете, что означает чистый компонент в React, почему функции render не должны иметь побочных эффектов и как находить и исправлять распространённые нарушения чистоты.

Что такое чистая функция

Чистая функция всегда возвращает один и тот же результат для одинаковых входных данных и не вызывает наблюдаемых побочных эффектов. React ожидает, что функция компонента будет чистой: для одинаковых свойств и состояния она всегда должна возвращать один и тот же JSX.

Почему чистота важна в React

React может вызывать ваш компонент несколько раз (StrictMode, конкурентные возможности и render на сервере). Если во время render выполняются побочные эффекты, например вызовы программного интерфейса, изменения DOM или запись глобальных переменных, они будут непредсказуемо выполняться несколько раз.

Распространённое нарушение чистоты: изменение внешнего состояния

Никогда не изменяйте во время render переменные, определённые за пределами компонента. Изменения допустимы внутри обработчиков событий или useEffect, но не во время render.
let totalRenders = 0; // external
function Counter() {
  totalRenders++; // BAD: side effect in render
  return <p>{totalRenders}</p>;
}

Распространённое нарушение чистоты: изменение свойств

Никогда не изменяйте объект свойств внутри компонента. Свойства доступны только для чтения. Если вам нужна изменённая версия, создайте новую переменную.
// Bad
function Badge({ user }) {
  user.name = user.name.toUpperCase(); // mutates prop!
  return <p>{user.name}</p>;
}

// Good
function Badge({ user }) {
  const displayName = user.name.toUpperCase();
  return <p>{displayName}</p>;
}

Распространённое нарушение чистоты: использование случайных значений и дат во время render

Прямой вызов `Math.random()` или `Date.now()` во время render создаёт разные значения при каждом вызове и нарушает чистоту. Перенесите их в инициализаторы состояния или в useEffect.
// Bad
function Token() {
  const id = Math.random(); // different every render!
  return <p>{id}</p>;
}

// Good
function Token() {
  const [id] = useState(() => Math.random());
  return <p>{id}</p>;
}

Вызовы программного интерфейса выполняются в useEffect

Загрузка данных непосредственно в теле функции компонента, а не в useEffect, нарушает чистоту и запускается при каждом render. Всегда переносите вызовы загрузки в useEffect с подходящими зависимостями.
// Bad
function Profile({ id }) {
  fetch('/api/user/' + id); // runs on every render!
  return <div />;
}

// Good
useEffect(() => {
  fetch('/api/user/' + id).then(/*...*/);
}, [id]);

Локальные изменения допустимы

Создавать и изменять объекты или массивы, созданные *внутри* того же вызова render, совершенно допустимо: никто другой не может их наблюдать. Это называется локальным изменением.
function List({ items }) {
  const sorted = [...items]; // new array
  sorted.sort();             // mutating a local copy: OK
  return sorted.map(i => <li key={i}>{i}</li>);
}

Поиск нарушений чистоты с помощью строгого режима

StrictMode вызывает ваш компонент дважды в режиме разработки. Если пользовательский интерфейс отличается при этих двух вызовах или вы видите повторяющиеся побочные эффекты, ваш render нечист. Исправляйте нарушение чистоты, пока двойной вызов не станет безвредным.

Чистые компоненты и React.memo

Если компонент чистый (одинаковые свойства → одинаковый результат), обёртывание его в `React.memo` сообщает React, что можно пропустить повторный render, если свойства не изменились, и тем самым повысить производительность.
const Pure = React.memo(function Pure({ value }) {
  return <p>{value}</p>;
});

Быстрая проверка

Какой из перечисленных побочных эффектов допустимо выполнять непосредственно внутри функции render компонента React?

Итоги

Чистые компоненты всегда возвращают один и тот же JSX для одинаковых входных данных. Не изменяйте свойства или внешние переменные во время render, используйте useEffect для побочных эффектов и полагайтесь на StrictMode при обнаружении нарушений.

Далее

Следующий урок: **Лучшие практики для ключей и ссылок** — вы научитесь правильно использовать стабильные ключи, избегать проблемы индекса в качестве ключа и работать со ссылками обратного вызова.

Часто задаваемые вопросы

Урок «Чистые компоненты и отказ от побочных эффектов при отрисовке» бесплатный?

Да — полный текст урока «Чистые компоненты и отказ от побочных эффектов при отрисовке» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Чистые компоненты и отказ от побочных эффектов при отрисовке»?

Пишите функции отрисовки без мутаций и чтения внешних данных Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

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

Сколько времени занимает урок «Чистые компоненты и отказ от побочных эффектов при отрисовке»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Что делает StrictMode
  2. Чистые компоненты и отказ от побочных эффектов при отрисовке
  3. Лучшие практики для ключей и ссылок
  4. Структура папок и соглашения об именовании
← Назад к React Academy