Componentes: una función que devuelve una pantalla
Un componente como una función con entradas y una salida, las props como entradas de solo lectura, y por qué construir cosas grandes a partir de cosas pequeñas es mejor que copiar y pegar.
Abre cualquier aplicación real y cuenta las piezas pequeñas que se repiten: una insignia, un precio, una fila de una lista, una tarjeta de un catálogo. Cada una de esas piezas es un componente. Escribir uno no es tanto una habilidad nueva como una vieja con otra ropa.
En la ruta de lenguajes, una función era una caja con nombre: entran valores, sale un valor, y el nombre es la forma de llamarla. Un componente es exactamente esa caja con un cambio: lo que sale es una pieza de interfaz.
function totalPrice(price, count) {
return price * count;
}
totalPrice(2.50, 4);
function Badge({ label }) {
return <span className="badge">{label}</span>;
}
const view = <Badge label="New" />;La misma forma dos veces: entran números y sale un número, entran propiedades y salen elementos.Ese es todo el truco. Un componente es una pieza de la interfaz con nombre. Le das un nombre, dices qué necesita y, a partir de ahí, el resto del programa puede pedir una insignia o una fila de precio sin saber cómo se dibuja ninguna de las dos.
Aquí hay un catálogo: tres productos, una sola forma de tarjeta. Escrita una vez, usada tres veces.
function ProductCard({ title, price, inStock }) {
return (
<article>
<h2>{title}</h2>
<p>{price}</p>
{inStock ? <button>Add</button> : <p>Sold out</p>}
</article>
);
}
function Catalogue() {
return (
<section>
<ProductCard title="Bread" price="2.50" inStock={true} />
<ProductCard title="Tea" price="3.20" inStock={false} />
<ProductCard title="Apples" price="1.80" inStock={true} />
</section>
);
}Una sola tarjeta, descrita una vez, usada tres veces con entradas distintas.Las entradas se escriben como atributos y llegan juntas en un solo objeto llamado props. En este ejemplo la tarjeta recibe title, price y inStock, y no le importa de dónde vienen.
function Price({ amount }) {
amount = amount + 1;
return <p>{amount}</p>;
}
function Price({ amount }) {
const [shown, setShown] = useState(amount);
return <p>{shown}</p>;
}La segunda versión no es mejor porque sea más larga. Es mejor porque el número ahora pertenece al componente que lo cambia.La alternativa honesta a los componentes es copiar y pegar, y para dos tarjetas está bien. La factura llega después. El diseñador pide una esquina redondeada en todas las tarjetas: ahora editas doce archivos. Una regla de precios cambia para incluir impuestos: arreglas nueve y te olvidas de tres, y el catálogo muestra dos precios distintos para el mismo producto. Un componente convierte cada uno de esos casos en una sola edición en un solo lugar, porque hay un único lugar que sabe cómo se ve una tarjeta.
Práctica
Un componente de tarjeta de compra recibe title, price e inStock desde el catálogo que lo rodea. Tiene que mostrar si el producto está agotado. ¿Cuáles de estos puede reescribir el componente?
Pistas
- Uno de estos es un dato que llegó desde afuera del componente. Todo lo que el componente recibe entra en esa categoría.
- El componente no guarda una prop. Si algo de adentro cambia por su cuenta, no puede haber llegado como prop.
Un catálogo dibuja una tarjeta de producto por cada elemento que recibió. Ordena el recorrido desde los datos hasta los píxeles.
- 1La tarjeta devuelve una descripción de los elementos que quiere
- 2Los elementos se dibujan dentro de la página
- 3La función de la tarjeta se ejecuta y lee esas entradas
- 4El componente padre construye la tarjeta y le entrega sus entradas
Pistas
- Empieza un paso antes de la tarjeta misma y termina con algo que el navegador pueda dibujar.
- Dentro de la tarjeta el camino va desde las entradas empaquetadas hasta los árboles devueltos.
Relaciona cada parte de un componente con la parte de una función que cumple.
Pistas
- Relaciona cada pieza de la interfaz con la parte de una función que cumple.
- Las entradas son los paréntesis, el nombre es como la llaman otras partes y la regla es lo que pasa adentro.