Este guĂa está diseñada para llevarte desde los conceptos básicos hasta patrones avanzados, con ejemplos prácticos, consejos de buenas prácticas y advertencias sobre errores comunes.
đź“‹ Tabla de contenidos
-
useState
– El fundamento del estado -
useEffect
– Efectos secundarios y ciclo de vida -
useContext
– Compartir estado sin props -
useReducer
– Lógica de Estado Compleja y predecible -
useRef
– Referencias, Almacenamiento y Escape -
useMemo
yuseCallback
– Optimizando el Rendimiento - Custom Hooks – Creando Lógica Reutilizable
- Errores Comunes y Soluciones
- Recursos Adicionales
🔹 1. useState
– Manejar el estado local
¿Qué es y para qué sirve?
useState
es el hook más fundamental. Te permite añadir una "variable de estado" a tus componentes de función. A diferencia de una variable normal, cuando el valor de esta variable cambia, React automáticamente vuelve a renderizar el componente para reflejar el cambio en la interfaz.
Úsalo para: manejar datos que cambian con el tiempo y que afectan a lo que se ve en pantalla, como el valor de un input, si un modal está abierto o los datos de un contador.
Sintaxis y parámetros
const [estado, setEstado] = useState(valorInicial);
-
valorInicial
: El valor que tendráestado
la primera vez que se renderice el componente. Puede ser cualquier tipo de dato (nĂşmero, string, objeto, array, etc.). -
estado
: La variable que contiene el valor actual del estado. Es de solo lectura. -
setEstado
: La funciĂłn que usas para actualizar el valor deestado
. Al llamarla, se dispara una nueva renderizaciĂłn.
Ejemplo práctico detallado: formulario de registro
En lugar de un simple contador, veamos un ejemplo más realista: un formulario de registro que maneja un objeto como estado.
import React, { useState } from 'react';
function FormularioRegistro() {
const [usuario, setUsuario] = useState({
nombre: '',
email: '',
password: '',
});
const handleChange = (e) => {
const { name, value } = e.target;
// Usamos la forma funcional de setState para asegurar que tenemos el estado más reciente
setUsuario(prevUsuario => ({
...prevUsuario,
[name]: value,
}));
};
const handleSubmit = (e) => {
e.preventDefault();
// AquĂ normalmente enviarĂas los datos a un servidor
alert(`Usuario registrado: ${usuario.nombre} con email ${usuario.email}`);
console.log(usuario);
};
return (
<form onSubmit={handleSubmit}>
<h3>Formulario de Registro</h3>
<input
type="text"
name="nombre"
placeholder="Nombre"
value={usuario.nombre}
onChange={handleChange}
/>
<input
type="email"
name="email"
placeholder="Email"
value={usuario.email}
onChange={handleChange}
/>
<input
type="password"
name="password"
placeholder="Contraseña"
value={usuario.password}
onChange={handleChange}
/>
<button type="submit">Registrarse</button>
</form>
);
}
âś… Buenas practicas y patrones comunes
- Agrupar estado relacionado: Si varios estados cambian juntos, considera agruparlos en un objeto o array. Esto es Ăştil en formularios.
- Usar la actualizaciĂłn funcional: Cuando el nuevo estado depende del anterior (como en un contador), usa
setContador(c => c + 1)
. Esto evita problemas con el estado "viejo" (stale state) en operaciones asĂncronas. - La actualizaciĂłn de estado es asĂncrona: No esperes que el valor del estado se actualice inmediatamente despuĂ©s de llamar a
setEstado
. Si necesitas realizar una acción después de que el estado cambie, usauseEffect
. - No mutes el estado directamente: Especialmente con objetos y arrays. En lugar de
usuario.nombre = 'nuevo'
, crea un nuevo objeto:setUsuario({...usuario, nombre: 'nuevo'})
. La inmutabilidad es clave en React.
🚨 Errores comunes y cómo evitarlos
-
Error: Modificar el estado directamente.
// MAL ❌ const [user, setUser] = useState({ name: 'Ana' }); user.name = 'Juan'; // No dispara re-render y es un anti-patrón setUser(user);
- SoluciĂłn: Siempre crea un nuevo objeto/array.
// BIEN âś… setUser({ ...user, name: 'Juan' });
-
Error: Llamar a
useState
dentro de condicionales, bucles o funciones anidadas.- SoluciĂłn: Los hooks siempre deben llamarse en el nivel superior del componente. React depende del orden en que se llaman para funcionar correctamente.
🚀 Retos prácticos
- Contador con LĂmite: Crea un contador que no pueda pasar de 10 ni ser menor que 0.
- Input con ValidaciĂłn: Haz un input que muestre un mensaje de error si el texto tiene menos de 5 caracteres.
- Toggle de Visibilidad: Un botĂłn que muestre u oculte un texto.
- Lista de Tareas Simple: Un input para añadir tareas a una lista. Cada tarea debe tener un botón para eliminarla (pista: necesitarás manejar un array en el estado).
Top comments (0)