Busca en todas las páginas de la documentación
Lee el valor de una promesa o contexto durante el renderizado — la nueva primitiva de React 19 para datos asíncronos y contexto condicional.
Tarjeta de referencia rápida — lista para copiar y pegar.
// Lee una promesa (se suspende hasta que se resuelva)
const data = use(dataPromise);
// Lee contexto (funciona en condiciones y bucles — a diferencia de useContext)
if (showTheme) {
const theme = use(ThemeContext);
}Cuándo usarlo: Tienes una promesa creada fuera del componente (pasada como prop o desde una caché) y quieres leer su valor con Suspense, o necesitas leer contexto condicionalmente.
"use client";
import { Suspense, use, useState } from "react";
interface User {
id: number;
name: string;
email: string;
}
function fetchUser(id:
Lo que esto demuestra:
use(userPromise) suspende UserProfile hasta que la promesa se resuelvaSuspense muestra un fallback mientras la promesa está pendientesetUserPromise) activa una nueva suspensiónuse puede leer dos tipos de valores: Promesas y Contextos de Reactuse suspende el componente hasta que la promesa se resuelva, luego devuelve el valor resuelto. Si la promesa se rechaza, lanza hacia el límite de error más cercanouse lee el valor del proveedor más cercano, al igual que useContext, pero a diferencia de useContext, puede llamarse dentro de condiciones, bucles y retornos tempranosuse no es técnicamente un hook — no sigue las "reglas de hooks" respecto a llamadas condicionales. Sin embargo, solo puede llamarse durante el renderizado (no en manejadores de eventos o efectos)| Parámetro | Tipo | Descripción |
|---|---|---|
resource | Promise<T> o Context<T> | Una promesa para leer, o un contexto de React para consumir |
| Retorno | Tipo | Descripción |
|---|---|---|
value | T | El valor resuelto de la promesa, o el valor de contexto actual |
Lectura de contexto condicional:
function Toolbar({ isLoggedIn }: { isLoggedIn: boolean }) {
if (isLoggedIn) {
const user = use(UserContext); // Esto está permitido — a diferencia de useContext
return <p>Bienvenida, {user.name}</p>;
}
return <p>Por favor inicia sesión</
Leyendo una promesa en caché (patrón común):
// Guarda la promesa en caché para que no se recree en cada renderizado
const cache = new Map<string, Promise<Data>>();
function getData(key: string): Promise<Data> {
if (!cache.has(key)) {
Con límite de error:
<ErrorBoundary fallback={<p>Algo salió mal</p>}>
<Suspense fallback={<Spinner />}>
<AsyncComponent dataPromise={promise} />
</Suspense>
</ErrorBoundary>Componente de servidor pasando promesa a componente de cliente:
// Componente de servidor
async function Page() {
const dataPromise = fetchData(); // No esperes — pasa la promesa
return (
<Suspense fallback={<Loading />}>
<ClientComponent dataPromise={dataPromise} />
</Suspense>
// El tipo se infiere de la promesa o contexto
const user = use(userPromise); // User (inferida de Promise<User>)
const theme = use(ThemeContext); // Theme (inferida de Context<Theme>)
// Tipado explícito cuando sea necesario
const data = use<ApiResponse>(dataPromise);
// La reducción de tipo de contexto funciona igual que useContext
const ctx = use
Crear promesas durante el renderizado — Escribir use(fetch("/api/data")) dentro de un componente crea una nueva promesa en cada renderizado, causando suspensión infinita. Solución: Crea la promesa fuera del componente, en un padre, o en una caché.
Sin manejo de rechazo en el componente — Si la promesa se rechaza, use lanza el error. Sin un límite de error, esto bloquea la aplicación. Solución: Siempre envuelve los componentes que consumen use en un límite de error.
No es un hook completo — use puede llamarse condicionalmente, pero aún solo puede llamarse durante el renderizado. Llamarlo en un manejador de eventos o useEffect no funciona. Solución: Llama a use solo en el cuerpo del componente durante el renderizado.
La identidad de la promesa importa — Si pasas un nuevo objeto de promesa (misma URL pero nueva llamada fetch), React lo trata como un nuevo recurso y re-suspende. Solución: Guarda en caché o memoriza tus promesas para que la misma solicitud lógica devuelva el mismo objeto de promesa.
No es un reemplazo para bibliotecas de obtención de datos — use maneja la lectura de una promesa con Suspense, pero no proporciona almacenamiento en caché, deduplicación o revalidación. Solución: Usa use con una capa de almacenamiento en caché, o usa una biblioteca de obtención de datos como TanStack Query.
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
useEffect + useState | Necesitas obtener datos y gestionar manualmente el estado de carga/error | Quieres estados de carga basados en Suspense |
useContext | Necesitas contexto pero no necesitas lecturas condicionales | Necesitas leer contexto dentro de condiciones o bucles |
| TanStack Query | Necesitas almacenamiento en caché, deduplicación, revalidación y paginación | Lecturas de datos simples y únicas con Suspense |
| Componentes de servidor | Los datos se pueden obtener completamente en el servidor | Los datos dependen del estado del lado del cliente |
await en Componentes de servidor | Estás en un componente de servidor y puedes esperar directamente | Estás en un componente de cliente |
¿Cuándo usar use vs useEffect para obtener datos? Prefiere use cuando quieras transmisión basada en Suspense y la promesa se cree fuera del componente de renderizado. Usa useEffect cuando necesites control detallado sobre estados de carga/error o necesites obtener datos en función de interacciones del lado del cliente.
use?use puede leer dos tipos: Promesas y Contextos de React.useContext pero puede llamarse condicionalmente.use no es técnicamente un hook aunque comience con "use"?use no sigue las "reglas de hooks" para llamadas condicionales.use dentro de sentencias if, bucles y después de retornos tempranos.use(fetch("/api/data")) causa suspensión infinita?fetch() dentro del componente crea una nueva promesa en cada renderizado.use se rechaza?use lanza el error, que se propaga al límite de error más cercano.use en un ErrorBoundary.const cache = new Map<string, Promise<Data>>();
function getData(key: string): Promise<Data> {
if (!cache.has(key)) {
use(Context) de useContext(Context)?use(Context) puede llamarse dentro de condiciones, bucles y después de retornos tempranos.useContext(Context) debe seguir las reglas de hooks -- solo en el nivel superior.use cuando necesites lecturas condicionales.use en manejadores de eventos o useEffect?use solo puede llamarse durante el renderizado (el cuerpo del componente).await directamente o gestiona el estado con useState.async/await con useEffect.use con tipos en TypeScript?// El tipo se infiere de la promesa o contexto
const user = use(userPromise); // User (de Promise<User>)
const theme = use(ThemeContext); // Theme (de Context<Theme>)
// Generic explícito cuando sea necesario
const data = use<ApiResponse>(dataPromise);use?fetch()), React lo trata como un nuevo recurso.use vs useEffect + useState para obtener datos?use cuando quieras transmisión basada en Suspense y la promesa se cree fuera del componente.useEffect + useState cuando necesites control detallado de carga/error o obtener datos en función de interacciones del cliente.use no proporciona almacenamiento en caché, deduplicación o revalidación -- emparéjalo con una capa de almacenamiento en caché para uso en producción.// Componente de servidor
async function Page() {
const dataPromise = fetchData(); // No esperes
return (
<Suspense fallback={<Loading />}>
<ClientComponent dataPromise={dataPromise} />
</Suspense