Производные и асинхронные атомы
Составляйте производные атомы из других атомов и создавайте асинхронные атомы, интегрированные с Suspense
«Производные и асинхронные атомы» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Производные атомы только для чтения
Создайте производный атом, передав функцию получения: const doubleAtom = atom(get => get(countAtom) * 2). У этого атома нет собственного сохранённого значения: он пересчитывается при каждом изменении countAtom.
Производные атомы всегда актуальны и не требуют ручной синхронизации. В Jotai они соответствуют вычисляемым свойствам.
Автоматическое отслеживание зависимостей
Jotai отслеживает, к каким атомам обращались внутри функции получения, и автоматически повторно вычисляет производный атом при изменении любого из них. Объявлять зависимости явно не нужно.
Если функция получения вызывает get(atomA) и get(atomB), производный атом обновляется при изменении atomA или atomB.
Производные атомы с возможностью записи
Производный атом с возможностью записи имеет и функцию получения, и setter: atom(get => get(baseAtom).toUpperCase(), (get, set, newValue) => set(baseAtom, newValue.toLowerCase())). При чтении возвращается преобразованное значение, а при записи оно преобразуется и сохраняется обратно.
Этот подход реализует двустороннее преобразование данных, не раскрывая базовый атом напрямую.
Асинхронные атомы с Promise
Функция получения может быть асинхронной: const userAtom = atom(async get => { const id = get(userIdAtom); return await fetchUser(id); }). Jotai изначально поддерживает Promise, возвращаемые функциями получения атомов.
При изменении userIdAtom Jotai автоматически повторно запускает асинхронную функцию получения, а использующий её компонент приостанавливает работу на время загрузки.
Асинхронные атомы и React Suspense
Асинхронные атомы легко интегрируются с React Suspense. Оберните использующий их компонент в границу Suspense с резервным содержимым. Компонент приостанавливается, пока Promise ожидает завершения, и отображается после его выполнения.
Это устраняет необходимость вручную управлять состоянием загрузки в компоненте: не нужны ни флаг isLoading, ни useEffect для загрузки данных.
loadable: отказ от Suspense
Импортируйте loadable из jotai/utils. Оберните асинхронный атом: const loadableUserAtom = loadable(userAtom). Компоненты, читающие loadableUserAtom, получают {state: 'loading'}, {state: 'hasData', data: user} или {state: 'hasError', error}, не приостанавливая работу.
Используйте loadable, когда нужно отображать собственное состояние загрузки непосредственно в компоненте, а не полагаться на границу Suspense.
Сброс атомов
Утилита atomWithReset из jotai/utils создаёт атом, который можно вернуть к исходному значению с помощью символа RESET. Это чище, чем вручную отслеживать исходное значение и повторно применять его.
В формах сбрасывайте все атомы полей при отправке или отмене, вызывая setter каждого из них с RESET в одном обработчике.
Цепочки атомов
Производный атом может читать данные из нескольких других атомов: const summaryAtom = atom(get => ({ user: get(userAtom), settings: get(settingsAtom), count: get(countAtom) })). Так создаётся одна стабильная ссылка, которая обновляется при изменении любой зависимости.
Компоненты, которым нужна только сводка, подписываются на summaryAtom, а не на все три отдельных атома.
Условные атомы
Производные атомы могут условно читать разные атомы: const activeDataAtom = atom(get => get(modeAtom) === 'A' ? get(dataAAtom) : get(dataBAtom)). При переключении modeAtom производный атом автоматически меняет источник данных.
При каждом вычислении Jotai заново подписывается на нужный атом, поэтому устаревшие данные из неактивной ветви не используются.
Обработка ошибок в асинхронных атомах
Если функция получения асинхронного атома выбрасывает ошибку или отклоняет Promise, ошибка передаётся ближайшей границе обработки ошибок React при использовании Suspense. С loadable ошибка появляется в поле state.error для обработки непосредственно в компоненте.
В рабочем коде всегда используйте для асинхронных атомов либо ErrorBoundary, либо обёртку loadable.
Производительность производных атомов
Производные атомы запоминают свой последний результат. Если все зависимые атомы возвращают те же значения, что и при предыдущем вычислении, производный атом возвращает ту же ссылку, поэтому зависимые компоненты не рендерятся повторно.
Для дорогостоящих вычислений, например преобразований больших массивов, такое запоминание заметно повышает производительность без дополнительной настройки.
Интеграция асинхронного атома с Suspense
Что происходит с компонентом, читающим асинхронный атом, пока его Promise ожидает завершения?
Повторение урока
Производные атомы вычисляют значения на основе других атомов с помощью функций получения и автоматического отслеживания зависимостей. Асинхронные атомы используют асинхронные функции получения и по умолчанию интегрируются с React Suspense; используйте loadable из jotai/utils, чтобы отказаться от Suspense и обрабатывать состояния загрузки и ошибок непосредственно в компоненте.
Производные атомы с возможностью записи поддерживают двусторонние преобразования, а условные атомы динамически меняют источники данных на основе значений других атомов.
Изучай React с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 88
- Уроки
- 324
Часто задаваемые вопросы
Урок «Производные и асинхронные атомы» бесплатный?
Да — полный текст урока «Производные и асинхронные атомы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Производные и асинхронные атомы»?
Составляйте производные атомы из других атомов и создавайте асинхронные атомы, интегрированные с Suspense Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Производные и асинхронные атомы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Атомы: единица состояния в Jotai
- Чтение и запись атомов с помощью useAtom
- Производные и асинхронные атомы
- Jotai, Zustand и Context: что и когда использовать