Busca en todas las páginas de la documentación
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
React 19 es una versión importante que introduce arquitectura orientada al servidor, nuevos hooks y optimizaciones automáticas. Aquí está la lista de referencia rápida de todas las características que llegaron:
Característica Categoría
-------------- ---------
Server Components (RSC) Arquitectura
Server Actions Mutaciones de datos
Form Actions Integración DOM
use() hook Obtención de datos / contexto
useActionState Gestión del estado del formulario
useFormStatus Interfaz de usuario pendiente
useOptimistic Actualizaciones optimistas
ref como prop Simplificación de API
Document Metadata SEO / gestión de head
Asset Loading APIs Rendimiento
React Compiler Auto-memoizaciónCuándo usarlo: Lee esta página primero cuando inicies un nuevo proyecto en React 19 o planifiques una migración desde React 18.
// Un componente que toca muchas características de React 19 a la vez
import { use, useOptimistic, useActionState } from "react";
import { saveComment } from "./actions"; // server action
type Comment = { id: string; text: string };
function CommentThread({ commentsPromise }: { commentsPromise: Promise<Comment[]> }) {
// use() desenvuelve la promesa (consciente de Suspense)
const comments = use(commentsPromise);
// useOptimistic para retroalimentación instantánea
const [optimistic, addOptimistic] = useOptimistic(
comments,
(state, newText: string) => [...state, { id: "temp", text: newText }]
);
// useActionState para conectar una server action
const [_state, formAction, isPending] = useActionState(
async (_prev: Comment[], formData: FormData) => {
const text = formData.get("text") as string;
addOptimistic(text);
await saveComment(text);
return [...comments, { id: crypto.randomUUID(), text }];
},
comments
);
return (
<section>
{/* Los metadatos del documento se elevan a <head> automáticamente */}
<title>Comentarios ({optimistic.length})</title>
<meta name="description" content="Hilo de comentarios en vivo" />
<ul>
{optimistic.map((c) => (
<li key={c.id}>{c.text}</li>
))}
</ul>
<form action={formAction}>
<input name="text" required />
<button disabled={isPending}>Publicar</button>
</form>
</section>
);
}
// ref como prop - no se necesita forwardRef
function FancyInput({ placeholder, ref }: { placeholder: string; ref?: React.Ref<HTMLInputElement> }) {
return <input placeholder={placeholder} ref={ref} />;
}
export { CommentThread, FancyInput };Lo que esto demuestra:
use() desenvuelve una promesa dentro de un componenteuseOptimistic para retroalimentación instantánea de la interfazuseActionState vinculando una server action a un formulario<title>, <meta>) renderizados en línearef recibido como un prop regular sin forwardRef"use server" que el framework convierte en endpoints RPC. Se pueden pasar a formularios, llamadas desde manejadores de eventos o invocadas desde transiciones.<form action={fn}>. React gestiona el estado pendiente, el manejo de errores y las actualizaciones optimistas automáticamente.useFormState experimental. Devuelve [state, action, isPending] y funciona tanto en el cliente como con mejora progresiva en el servidor.<form> padre más cercano a cualquier componente descendiente.forwardRef ya no es requerido. Los componentes de función reciben ref como un prop regular. forwardRef aún funciona pero está deprecado y se eliminará en una versión futura.<title>, <meta>, <link>) renderizadas en cualquier lugar del árbol de componentes se elevan automáticamente a <head>.preload, preinit, prefetchDNS, preconnect) de react-dom te permiten cargar con entusiasmo fuentes, scripts y hojas de estilo.useMemo, useCallback y React.memo manuales en la mayoría de los casos.React 19 funciona en dos modos principales:
use(), actualizaciones optimistas, elevación de metadatos y el compilador. Sin server components ni server actions.@types/react y @types/react-dom actualizados (versión 19+). Instálalos juntos.ref ahora es parte del tipo de props. Si usas React.ComponentProps<typeof MyComponent>, incluirá ref automáticamente.useActionState es genérico: useActionState<State>(action, initialState).use() es genérica: use<T>(resource: Promise<T> | React.Context<T>): T.useFormState fue renombrado. Arreglo: Reemplaza todas las importaciones de useFormState con useActionState desde "react" (no "react-dom").forwardRef aún funciona pero desencadena una advertencia de deprecación en desarrollo. Arreglo: Refactoriza para aceptar ref como un prop regular.<Context> ahora se puede renderizar directamente en lugar de <Context.Provider>. La sintaxis .Provider aún funciona pero está deprecada. Arreglo: Reemplaza <MyContext.Provider value={v}> con <MyContext value={v}>.undefined implícitamente) será marcado. Arreglo: Si tu callback de ref no devuelve nada, asegúrate de que explícitamente devuelva undefined o devuelva una limpieza.| Enfoque | Cuándo elegir |
|---|---|
| Permanecer en React 18 | Aplicación grande sin necesidad inmediata de server components o nuevos hooks |
| Adopción incremental | Agrega "use client" a componentes existentes y adopta características de React 19 archivo por archivo |
| Reescritura completa con RSC | Proyecto greenfield usando Next.js 15+ o un framework con soporte RSC |
| React 19 solo cliente | SPA que se beneficia de use(), actualizaciones optimistas y el compilador sin infraestructura de servidor |
"use client"use() para leer promesas y contexto (se puede llamar condicionalmente)useActionState para gestión del estado del formulario (reemplaza useFormState)useFormStatus para interfaz de usuario pendiente en descendientes del formulariouseOptimistic para actualizaciones optimistas instantáneaspreload, preinit, prefetchDNS, preconnectuse(), actualizaciones optimistas, elevación de metadatos y el React CompileruseFormState fue renombrado a useActionState antes de la versión estable"react", no desde "react-dom"useActionState(action, initialState) devolviendo [state, action, isPending]Las etiquetas como <title>, <meta> y <link> renderizadas en cualquier lugar del árbol de componentes se elevan automáticamente a <head>:
function Page() {
return (
<div>
<title>Mi página</title>
<meta name="description" content="¡Hola!" />
<h1>Contenido</h1>
</div>
);
}ref como un prop regularforwardRef aún funciona pero está deprecado y se eliminará en una versión futuraref del segundo argumento forwardRef al objeto propsundefined implícitamente desde una expresión de función flecha) será marcado como una advertenciaconst [state, action, isPending] = useActionState<MyState>(
async (prev: MyState, formData: FormData) => {
// devuelve nuevo estado
return { ...prev, updated: true };
},
{ updated: false }
);useActionState es genérico: useActionState<State>(action, initialState)(prevState: State, formData: FormData) => Promise<State>use<T>(resource: Promise<T> | React.Context<T>): T"react": import { use } from "react"useMemo, useCallback y React.memo manuales en la mayoría de los casosuse() se puede llamar condicionalmente (dentro de bloques if, bucles, retornos anticipados) mientras que useContext nouse() también acepta promesas, no solo objetos de contextouse(context) es el reemplazo preferido para useContext(context) en adelante"use client" a componentes existentes y adopta características archivo por archivo@types/react y @types/react-dom versión 19+) juntosuseFormState con useActionState desde "react"<Context.Provider> con <Context value={v}> (opcional, la sintaxis antigua aún funciona)<form action={}>, useActionState, useFormStatusRevisado por Chris St. John·Última actualización: 19 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥