Выбор ответа Middle React 18-19: Suspense, transitions, RSC обновлено
Промис, созданный в рендере, и use
Вопрос
Что произойдёт с этим клиентским компонентом?
'use client';
function User({ id }) {
const user = use(fetch(`/api/users/${id}`).then((r) => r.json()));
return <h1>{user.name}</h1>;
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Каждый рендер даёт новый промис, и компонент приостанавливается снова. use приостанавливает компонент, пока промис не выполнен.
Варианты ответа
- Всё работает:
useкеширует промис по URL и не повторяет запрос - Ошибка:
useпринимает контекст, а промис нужно ждать черезawait - Данные загрузятся один раз, потом компонент перестанет обновляться
- Каждый рендер даёт новый промис, и компонент приостанавливается сноваправильный ответ
Разбор
use приостанавливает компонент, пока промис не выполнен. Когда React повторяет рендер, fetch вызывается заново и возвращает новый промис, которого React ещё не видел, и цикл повторяется. React предупреждает о некешированном промисе. Промис должен быть стабильным: его передают пропсом из серверного компонента, создают в загрузчике роутера или берут из кеша (например, библиотеки запросов).
useничего не кеширует по URL.- Промисы
useпринимать может, это его основная работа. - Загрузка не завершится нормально из-за постоянных новых промисов.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «React 18-19: Suspense, transitions, RSC»
- Автоматический батчинг
- useDeferredValue и debounce
- Что делает React Compiler
- Функция из серверного компонента в клиентский
- RSC и SSR
- Что запускает Suspense
- Transition для значения поля
- Ошибка гидрации