Volver al curso

React Fundamentals

leccion
10 / 13
beginner
10 horas
Estado con useState

Manejando multiples estados

Lectura
12 min~2 min lectura

Organizando el estado

Multiples useState

function Formulario() {
  const [nombre, setNombre] = useState('');
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [errors, setErrors] = useState({});
  const [isSubmitting, setIsSubmitting] = useState(false);

  // Cada estado es independiente
  // Util cuando no estan relacionados
}

Estado agrupado

function Formulario() {
  // Agrupa estados relacionados
  const [form, setForm] = useState({
    nombre: '',
    email: '',
    password: ''
  });

  const [ui, setUi] = useState({
    isSubmitting: false,
    errors: {}
  });

  const handleChange = (e) => {
    const { name, value } = e.target;
    setForm(prev => ({ ...prev, [name]: value }));
  };
}

Cuando separar vs agrupar?

  • Separar: Estados que cambian independientemente
  • Agrupar: Estados que siempre cambian juntos

Ejemplo practico: Filtros

function ProductList() {
  // Estados de filtro (relacionados)
  const [filters, setFilters] = useState({
    categoria: 'all',
    precioMin: 0,
    precioMax: 1000,
    ordenar: 'nombre'
  });

  // Estado de datos (independiente)
  const [productos, setProductos] = useState([]);

  // Estado de UI (independiente)
  const [isLoading, setIsLoading] = useState(false);

  const updateFilter = (key, value) => {
    setFilters(prev => ({ ...prev, [key]: value }));
  };

  return (
    <div>
      <select
        value={filters.categoria}
        onChange={(e) => updateFilter('categoria', e.target.value)}
      >
        <option value="all">Todas</option>
        <option value="tech">Tecnologia</option>
      </select>

      <input
        type="range"
        value={filters.precioMax}
        onChange={(e) => updateFilter('precioMax', e.target.value)}
      />
    </div>
  );
}

Levantando el estado (Lifting State)

// Cuando dos componentes necesitan compartir estado,
// muevelo al componente padre mas cercano

function App() {
  const [temperatura, setTemperatura] = useState(20);

  return (
    <div>
      <TermometroA temp={temperatura} onCambiar={setTemperatura} />
      <TermometroB temp={temperatura} onCambiar={setTemperatura} />
    </div>
  );
}