React 19: Nuevos Hooks y API use
Introducción
Documentación
El 5 de diciembre de 2024, React presentó su versión 19 con nuevas funcionalidades diseñadas para simplificar el desarrollo. Entre las novedades más destacadas se encuentran los hooks useTransition
, useActionState
, useFormStatus
, y la API use
. Estas herramientas reducen la complejidad del código y mejoran la experiencia al trabajar con estados, formularios y manejo de datos asincrónicos.
Nuevos Hooks
useTransition
Permite manejar estados de espera (como isPending
) en operaciones asincrónicas. Este hook es especialmente útil para mejorar la experiencia del usuario durante transiciones o solicitudes de red.
Ejemplo
import React, { useState, useTransition } from "react";
function UpdateName() {
const [name, setName] = useState("");
const [error, setError] = useState(null);
const [isPending, startTransition] = useTransition();
const handleSubmit = () => {
startTransition(async () => {
const error = await updateName(name);
if (error) {
setError(error);
return;
}
redirect("/path");
});
};
return (
<div>
<input value={name} onChange={(e) => setName(e.target.value)} />
<button onClick={handleSubmit} disabled={isPending}>Actualizar</button>
{error && <p>{error}</p>}
</div>
);
}
Ventajas
- Gestiona automáticamente el estado de espera (
isPending
). - Reduce la necesidad de manejar múltiples estados manualmente.
useActionState
Simplifica el manejo de formularios al devolver tres valores: state
, formAction
y isPending
. Este hook permite trabajar con acciones de formulario y su estado de forma eficiente.
Ejemplo básico
import { useActionState } from "react";
async function increment(prevState) {
return prevState + 1;
}
function StatefulForm() {
const [state, formAction] = useActionState(increment, 0);
return (
<form>
{state}
<button formAction={formAction}>Incrementar</button>
</form>
);
}
Ejemplo avanzado: Formulario de carrito
function AddToCartForm({ itemID, itemTitle }) {
const [message, formAction, isPending] = useActionState(addToCart, null);
return (
<form action={formAction}>
<h2>{itemTitle}</h2>
<input type="hidden" name="itemID" value={itemID} />
<button type="submit">Añadir al carrito</button>
{isPending ? "Cargando..." : message}
</form>
);
}
Beneficios
- Simplifica la gestión del estado en formularios.
- Permite manejar la lógica del formulario directamente en funciones asincrónicas.
useFormStatus
Proporciona información sobre el estado de la última solicitud de un formulario. Devuelve datos como pending
, data
, method
y action
.
Ejemplo
import { useFormStatus } from "react-dom";
function UsernameForm() {
const { pending, data } = useFormStatus();
return (
<div>
<h3>Solicitar un nombre de usuario:</h3>
<input type="text" name="username" disabled={pending} />
<button type="submit" disabled={pending}>Enviar</button>
<p>{data ? `Solicitando ${data.get("username")}...` : ""}</p>
</div>
);
}
Ventajas
- Proporciona un manejo centralizado del estado de los formularios.
- Permite acceder a datos específicos de campos enviados mediante
data.get()
.
Nueva API: use
Descripción
El nuevo hook use()
permite consumir recursos en tiempo de renderizado, suspendiendo el componente hasta que las promesas asociadas se resuelvan. Esta API reemplaza hooks como useEffect
, useState
y useContext
para el consumo de datos y contextos, simplificando significativamente el código.
Ejemplo
import { use } from "react";
function Comments({ commentsPromise }) {
const comments = use(commentsPromise); // Suspende hasta que la promesa se resuelve
return comments.map(comment => <p key={comment.id}>{comment.text}</p>);
}
function Page({ commentsPromise }) {
return (
<Suspense fallback={<div>Cargando...</div>}>
<Comments commentsPromise={commentsPromise} />
</Suspense>
);
}
Beneficios
- Elimina la necesidad de gestionar manualmente estados como
loading
oerror
. - Se integra perfectamente con los límites de Suspense, permitiendo una experiencia de carga optimizada.
- Unifica la lógica para manejar promesas y datos contextuales.
Conclusión
React 19 representa un paso adelante en la simplificación del desarrollo con herramientas como useTransition
, useActionState
, useFormStatus
y la nueva API use
. Estas funcionalidades ofrecen una experiencia más fluida, reduciendo la complejidad del código y potenciando la productividad de los desarrolladores.