Estado: datos que cambian mientras la pagina esta abierta
Por que hay que avisarle a la pantalla que algo cambio, la diferencia entre las propiedades y el estado, y por que escribir directamente en el estado hace que la actualizacion desaparezca.
Un botón de me gusta es uno de los programas más pequeños que la gente realmente usa. Guarda un número, le suma uno cuando haces clic y muestra el resultado. Casi todas las dificultades del desarrollo frontend se esconden dentro de esos tres pasos.
Empieza por la version ingenua, la que todo principiante escribe primero.
let likes = 0;
function like() {
likes = likes + 1;
}
like();
like();React resuelve esto entregando el valor y la manera de cambiarlo en la misma frase. useState devuelve un par: el valor de ahora y un setter. Llama al setter y el componente se ejecuta otra vez con el valor nuevo.
import { useState } from "react";
function LikeButton() {
const [likes, setLikes] = useState(0);
return (
<button onClick={() => setLikes(likes + 1)}>
{likes} likes
</button>
);
}El valor y la manera de cambiarlo, devueltos juntos.Las dos mitades de esa línea tienen trabajos distintos. likes es lo que esta pasada del componente ve y dibuja. setLikes es la única forma honesta de cambiar lo que verá la siguiente pasada. Un botón cuya etiqueta nunca cambia es casi siempre un botón que cambia la variable y nunca llama al setter.
La misma idea sirve para escribir. Un cuadro de búsqueda que pierde lo que escribiste es el síntoma clásico de un campo que nadie está recordando.
function SearchBox() {
const [text, setText] = useState("");
return (
<form>
<input value={text} onChange={(e) => setText(e.target.value)} />
<p>You typed: {text}</p>
</form>
);
}El campo muestra lo que guarda el estado, y cada tecla escribe de vuelta en el estado.Ahora viene la trampa que atrapa a todo el mundo, casi siempre con una lista de tareas. Los arreglos y los objetos no son valores como los números: son referencias a un lugar en la memoria. Si cambias el contenido, la referencia se queda exactamente donde estaba.
const [items, setItems] = useState(["Bread", "Tea"]);
function addBad(name) {
items.push(name);
setItems(items);
}
function addGood(name) {
setItems([...items, name]);
}Una de estas dos versiones deja la lista en pantalla sin cambios.Así que en un componente hay dos tipos de datos, y una sola pregunta los separa: quién tiene permitido cambiarlos. Las propiedades llegan desde afuera y son de solo lectura. El estado se posee adentro y se puede cambiar. Un contador con un paso configurable necesita las dos cosas.
function Counter({ step }) {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + step)}>
{count}
</button>
);
}
const a = <Counter step={1} />;
const b = <Counter step={5} />;El paso llega desde afuera, el contador se posee adentro.Práctica
Un componente de contador decide cuanto sumar en cada clic a partir de un valor de paso, y lleva el total acumulado por su cuenta. Cual de los dos es el estado?
Pistas
- El numero que aparece en la pantalla viene de uno de los dos, y solo uno de ellos lo puede escribir este componente.
- Una propiedad es un valor que llega desde afuera. Cambiarla por dentro seria como si el componente reescribiera su propia entrada.
Une cada valor con si llega como propiedad o si el componente lo tiene como estado.
Pistas
- Pregunta quien tiene permiso de escribir cada valor: el propio componente, o quien coloca el componente en la pagina.
- Dos de estos pertenecen al componente y cambian mientras el componente vive; los otros dos se deciden desde afuera.
Alguien hace clic en un botón de me gusta. Ordena lo que pasa después.
- 1La etiqueta del botón muestra el nuevo número
- 2La función del componente se ejecuta otra vez y lee el nuevo valor
- 3Se llama al setter con el nuevo número
- 4El manejador del clic se ejecuta
- 5React recuerda el nuevo valor para este componente
Pistas
- No se puede dibujar nada que todavía no se haya establecido, así que la llamada al setter va antes de la nueva imagen.
- El componente se ejecuta otra vez después de que el valor cambió, por eso el cuerpo de la función no es el primer paso de la siguiente pasada.