0Pricing
React Academy · Урок

Селекторы и предотвращение лишних повторных рендерингов

Извлекайте нужные части состояния через селекторы, чтобы компоненты перерисовывались только при необходимости.

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

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

В этом уроке Вы будете использовать селекторы Zustand, чтобы подписывать компоненты только на нужные им срезы состояния и предотвращать лишние повторные отображения при изменении других частей store.

Проблема селектора по умолчанию

Вызов хука store без селектора возвращает весь объект store. Компонент повторно отображается при каждом изменении store, даже если изменилось состояние, не связанное с ним.
// Bad: re-renders on every store change
const store = useAppStore();
return <p>{store.user.name}</p>;

Использование селектора

Передайте функцию-селектор в хук store. Компонент будет повторно отображаться только при изменении значения, возвращаемого селектором.
// Good: re-renders only when user.name changes
const name = useAppStore(s => s.user.name);
return <p>{name}</p>;

Проверка равенства ссылок

По умолчанию Zustand использует строгое равенство (===). Если Ваш селектор при каждом вызове возвращает новый объект или массив, компонент будет повторно отображаться, даже когда содержимое не изменилось.
// Creates a new object every time — always re-renders!
const info = useStore(s => ({ id: s.id, name: s.name }));

Исправление с помощью поверхностного равенства

Импортируйте `shallow` из zustand и передайте его как функцию равенства, чтобы избежать повторных отображений, когда содержимое объектов совпадает.
import { shallow } from 'zustand/shallow';

const info = useAppStore(
  s => ({ id: s.id, name: s.name }),
  shallow // compare by content, not reference
);

Выбор нескольких значений

Используйте шаблон с поверхностным равенством, чтобы выбирать несколько значений одновременно без лишних повторных отображений.
const { items, loading } = useCartStore(
  s => ({ items: s.items, loading: s.loading }),
  shallow
);

Стабильные ссылки на действия

Действия (функции) в Zustand имеют стабильные ссылки — они не меняются при обновлении состояния. Вы можете выбирать их без shallow, и они не будут вызывать повторные отображения.
// Actions are always stable — no shallow needed
const addToCart = useCartStore(s => s.addToCart);

Вспомогательная функция useShallow (Zustand 5+)

Zustand 5 предоставляет вспомогательную функцию useShallow, которая автоматически оборачивает селектор с поверхностным равенством и делает код чище.
import { useShallow } from 'zustand/react/shallow';

const { items, loading } = useCartStore(
  useShallow(s => ({ items: s.items, loading: s.loading }))
);

Объединение селекторов

Вычисляйте производные значения внутри селекторов, чтобы не хранить производное состояние в store. Вычисляйте в селекторе суммы, отфильтрованные списки или форматированные строки.
const totalPrice = useCartStore(
  s => s.items.reduce((sum, item) => sum + item.price, 0)
);

Профилирование повторных отображений Zustand

Используйте профилировщик React DevTools, чтобы проверить работу селекторов. После добавления в store элемента, не связанного с компонентом, убедитесь, что компонент, использующий только селектор имени, НЕ появляется на графике выполнения в виде пламени.

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

Почему при возврате объекта селектором Zustand необходимо использовать поверхностное равенство?

Итоги

Всегда используйте конкретные селекторы. Применяйте поверхностное равенство при выборе нескольких значений в виде объекта. Вычисляйте производные значения внутри селекторов. Действия имеют стабильные ссылки, поэтому shallow им не нужен.

Далее

Следующий урок: **Сохранение состояния с помощью промежуточного ПО persist** — Вы синхронизируете состояние Zustand с localStorage с помощью промежуточного ПО persist.

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

Урок «Селекторы и предотвращение лишних повторных рендерингов» бесплатный?

Да — полный текст урока «Селекторы и предотвращение лишних повторных рендерингов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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. Создание первого хранилища Zustand
  2. Селекторы и предотвращение лишних повторных рендерингов
  3. Сохранение состояния с промежуточным ПО persist
  4. DevTools Zustand и тестирование хранилищ
← Назад к React Academy