0Pricing
React Academy · Урок

Чтение и запись атомов с помощью useAtom

Используйте useAtom, useAtomValue и useSetAtom для чтения и обновления атомов во всём дереве компонентов

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

useAtom: основной хук

useAtom(someAtom) возвращает [value, setter], повторяя API useState. value — текущее состояние атома, а setter обновляет его. Используйте этот хук, когда компонент и читает, и записывает атом.

setter принимает либо новое значение, либо функцию обновления: setCount(c => c + 1).

useAtomValue: доступ только для чтения

useAtomValue(someAtom) возвращает только текущее значение, без setter. Используйте его в компонентах, предназначенных только для отображения: они читают состояние, но никогда не изменяют его.

Поскольку компонент не хранит ссылку на setter, намерение явно отражено в коде: этот компонент только читает данные.

useSetAtom: доступ только для записи

useSetAtom(someAtom) возвращает только функцию setter. Что особенно важно, он не подписывает компонент на значение атома. Компонент никогда не рендерится повторно при изменении атома.

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

Почему useSetAtom важен для производительности

Компонент, вызывающий useSetAtom(countAtom) для увеличения счётчика, никогда не рендерится повторно при изменении countAtom, поскольку у него нет подписки на значение. Повторно рендерится только компонент, отображающий счётчик.

Это простая, но мощная оптимизация: разделяйте компоненты, записывающие и читающие данные, чтобы предотвратить каскадный повторный рендеринг.

atomWithStorage для сохранения состояния

Импортируйте atomWithStorage из jotai/utils. Используйте его так же, как atom(), но передайте ключ хранилища первым аргументом: atomWithStorage('theme', 'light'). Атом автоматически синхронизируется с localStorage.

После перезагрузки страницы атом восстанавливает состояние из localStorage. Все компоненты, читающие этот атом, сразу получают сохранённое значение.

Сброс atomWithStorage

Символ RESET из jotai/utils можно передать setter атома atomWithStorage: setter(RESET). Это удаляет запись из localStorage и возвращает атом к исходному значению.

Это удобно для сценариев выхода из учётной записи или кнопок «восстановить значения по умолчанию» на страницах настроек.

Семейства атомов с atomFamily

atomFamily из jotai/utils создаёт фабрику, возвращающую атом с параметром. Например, atomFamily(id => atom(null)) создаёт отдельный атом для каждого переданного уникального идентификатора.

Это идеально подходит для состояния отдельных элементов, например selectedAtom(itemId) или expandedAtom(rowId), без необходимости управлять одной большой таблицей соответствий.

Очистка семейства атомов

Семейства атомов могут неограниченно разрастаться, если идентификаторы накапливаются. Используйте atomFamily.setShouldRemove((createdAt, param) => ...), чтобы задать условие очистки, которое Jotai применяет при удалении устаревших элементов семейства.

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

Инструменты разработчика Jotai

Пакет jotai-devtools предоставляет визуальную панель со списком всех активных атомов и их текущих значений. Установите его, оберните приложение в DevTools и просматривайте состояние атомов в реальном времени.

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

Пример выборочного повторного рендеринга

В большом списке компонент ListContainer может использовать useSetAtom(selectedIdAtom) для обновления выбранного элемента, не подписываясь на selectedIdAtom. При изменении выбора повторно рендерятся только отдельные компоненты ListItem, вызывающие useAtomValue(selectedIdAtom).

Этот подход хорошо масштабируется: добавление тысяч элементов списка не замедляет обновление выбора.

Объединение трёх хуков

Выбирайте хук в соответствии с задачами компонента: useAtomValue — для отображения, useSetAtom — для действий, а useAtom — когда нужны обе возможности. Такая структура API позволяет сразу понять ответственность компонента.

Компонент поля формы обычно использует useAtom; кнопка отправки — useSetAtom; подпись, отображающая счётчик, — useAtomValue.

useSetAtom и useAtom

В чём главное преимущество использования useSetAtom вместо useAtom?

Повторение урока

useAtom предоставляет и значение, и setter; useAtomValue — только значение (подписку для чтения); useSetAtom — только setter (без повторного рендеринга при изменении значения). atomWithStorage сохраняет значение в localStorage и поддерживает RESET, а atomFamily создаёт атомы с отдельными параметрами для динамических списков.

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

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

Урок «Чтение и запись атомов с помощью useAtom» бесплатный?

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

Чему я научусь в уроке «Чтение и запись атомов с помощью useAtom»?

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

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

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

Сколько времени занимает урок «Чтение и запись атомов с помощью useAtom»?

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

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

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

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

  1. Атомы: единица состояния в Jotai
  2. Чтение и запись атомов с помощью useAtom
  3. Производные и асинхронные атомы
  4. Jotai, Zustand и Context: что и когда использовать
← Назад к React Academy