Estado y useState
Gestionar el estado del componente con el hook useState
Que es el Estado?
El estado (state) es datos que un componente gestiona internamente y que pueden cambiar con el tiempo. Cuando el estado cambia, React vuelve a renderizar el componente automaticamente para reflejar los nuevos datos.
El Hook useState
import { useState } from 'react';
function Contador() {
// useState retorna un array: [valor, funcionSetter]
const [cuenta, setCuenta] = useState(0);
return (
<div>
<p>Cuenta: {cuenta}</p>
<button onClick={() => setCuenta(cuenta + 1)}>
Incrementar
</button>
</div>
);
}
Multiples Variables de Estado
function Formulario() {
const [nombre, setNombre] = useState('');
const [email, setEmail] = useState('');
const [edad, setEdad] = useState(0);
return (
<form>
<input
value={nombre}
onChange={(e) => setNombre(e.target.value)}
placeholder="Nombre"
/>
<input
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="Email"
/>
<input
type="number"
value={edad}
onChange={(e) => setEdad(Number(e.target.value))}
placeholder="Edad"
/>
</form>
);
}
Estado con Objetos
function PerfilUsuario() {
const [usuario, setUsuario] = useState({
nombre: '',
email: '',
edad: 0
});
const actualizarNombre = (nuevoNombre) => {
// Siempre crea un nuevo objeto, no mutes el existente
setUsuario({
...usuario,
nombre: nuevoNombre
});
};
return (
<input
value={usuario.nombre}
onChange={(e) => actualizarNombre(e.target.value)}
/>
);
}
Estado con Arrays
function ListaTareas() {
const [tareas, setTareas] = useState([]);
const agregarTarea = (texto) => {
setTareas([...tareas, { id: Date.now(), texto, completada: false }]);
};
const eliminarTarea = (id) => {
setTareas(tareas.filter(tarea => tarea.id !== id));
};
const toggleTarea = (id) => {
setTareas(tareas.map(tarea =>
tarea.id === id
? { ...tarea, completada: !tarea.completada }
: tarea
));
};
return (
<ul>
{tareas.map(tarea => (
<li key={tarea.id}>
<span style={{ textDecoration: tarea.completada ? 'line-through' : 'none' }}>
{tarea.texto}
</span>
<button onClick={() => toggleTarea(tarea.id)}>Toggle</button>
<button onClick={() => eliminarTarea(tarea.id)}>Eliminar</button>
</li>
))}
</ul>
);
}
Reglas del Estado
- Nunca mutes el estado directamente: Siempre usa la funcion setter
- El estado es asincrono: Los cambios no son inmediatos
- El estado es local: Cada instancia del componente tiene su propio estado