10-2-formulario
Explicación Detallada del Código ListaDeNombres
Este componente React permite agregar nombres a una lista y mostrarlos. Vamos a analizarlo parte por parte:
Estructura General
import { useState } from 'react';
function ListaDeNombres() {
// Estados
const [nombre, setNombre] = useState('');
const [nombres, setNombres] = useState([]);
// Manejador del formulario
const handleSubmit = (e) => {
e.preventDefault();
if (nombre.trim() === '') return;
setNombres([...nombres, nombre]);
setNombre('');
};
// Renderizado
return (
<div>
{/* Formulario para agregar nombres */}
<form onSubmit={handleSubmit}>
{/* Input controlado */}
<label>
Nombre:
<input
type="text"
value={nombre}
onChange={(e) => setNombre(e.target.value)}
/>
</label>
<button type="submit">Agregar</button>
</form>
{/* Lista de nombres */}
<h2>Nombres guardados:</h2>
<ul>
{nombres.map((nombre, index) => (
<li key={index}>{nombre}</li>
))}
</ul>
</div>
);
}Explicación Paso a Paso
1. Estados del Componente
const [nombre, setNombre] = useState(''); // Almacena el nombre actual del input
const [nombres, setNombres] = useState([]); // Almacena la lista de todos los nombresnombre: Guarda el valor temporal del input (string)
nombres: Guarda un array con todos los nombres agregados
2. Manejador del Formulario (handleSubmit)
const handleSubmit = (e) => {
e.preventDefault(); // Evita recarga de página
if (nombre.trim() === '') return; // Validación
setNombres([...nombres, nombre]); // Agrega nuevo nombre
setNombre(''); // Limpia el input
};e.preventDefault(): Detiene el comportamiento por defecto del formularionombre.trim() === '': Verifica si el input está vacío o solo tiene espacios[...nombres, nombre]: Crea un nuevo array con los nombres existentes más el nuevosetNombre(''): Limpia el input después de agregar
3. Renderizado del Formulario
<form onSubmit={handleSubmit}>
<label>
Nombre:
<input
type="text"
value={nombre}
onChange={(e) => setNombre(e.target.value)}
/>
</label>
<button type="submit">Agregar</button>
</form>value={nombre}: El input muestra el valor del estado
nombreonChange: Actualiza el estado
nombrecon cada tecla presionada
4. Renderizado de la Lista
<h2>Nombres guardados:</h2>
<ul>
{nombres.map((nombre, index) => (
<li key={index}>{nombre}</li>
))}
</ul>nombres.map(): Convierte el array de nombres en elementos<li>key={index}: React necesita una clave única para cada elemento de lista
Flujo Completo del Componente
Inicialización:
El input aparece vacío (
nombre = '')La lista de nombres está vacía (
nombres = [])
Cuando el usuario escribe:
Cada tecla presionada dispara
onChangesetNombre(e.target.value)actualiza el estadonombre
Cuando el usuario envía el formulario:
Se valida que no esté vacío
El nombre se agrega al array
nombresEl input se limpia (
setNombre(''))
Renderizado de la lista:
React detecta el cambio en
nombresy vuelve a renderizarLa lista muestra todos los nombres agregados
Visualización del Estado
Si agregamos "Ana", luego "Carlos" y luego "María", el estado cambiaría así:
Inicial:
nombre: '' nombres: []Después de agregar "Ana":
nombre: '' nombres: ['Ana']Después de agregar "Carlos":
nombre: '' nombres: ['Ana', 'Carlos']Después de agregar "María":
nombre: '' nombres: ['Ana', 'Carlos', 'María']
¿Por qué usar ...nombres?
La línea setNombres([...nombres, nombre]) crea un nuevo array con:
Todos los elementos existentes en
nombres(usando el operador spread...)El nuevo
nombreal final
Esto es importante porque en React debemos evitar mutar el estado directamente y siempre crear nuevos objetos/arrays cuando actualizamos el estado.
¿Te gustaría que profundice en algún aspecto específico de este código
Comentarios
Publicar un comentario