Component
React applications are built from independent pieces of UI called components.
Introduction
A React component is a TypeScript function to which you can add TSX.
Create a project with Deno
deno init --npm vite --template react-swc-ts react-componentComponent
Define the Greeting component which is used by the App component:
return
}
return
}Els components de React són funcions regulars de TypeScript, però els seus noms han de començar amb lletra majúscula o no funcionaran!
El component Greeting està nidat dins del component App.
Pots afegir tants components Greeting com vulguis dins del component App:
return
</>
)
}
return
}Al final el que el navegador veu és això:
Hello X
Hello X
Hello XNidar i organitzar components
Els components són funcions regulars de TypeScript, per això pots tenir múltiples components en el mateix arxiu.
Ja que els components Greeting es renderitzen dins d’App (fins i tot diverses vegades!) podem dir que App és un component pare, que renderitza cada Greeting com un «fill».
Aquesta és la part màgica de React: pots definir un component una vegada, i després utilitzar-lo en molts llocs i tantes vegades com vulguis.
Els components poden renderitzar altres components, però mai has de nidar les seves definicions:
// 🔴 ¡Nunca definas un componente dentro de otro componente!
// ...
}
// ...
}El fragment de codi de dalt és molt lent i causa errors.
En el seu lloc, defineix cada component en el primer nivell:
// ...
}
// ✅ Declara los componentes en el primer nivel
// ...
}Propietats
Els components de React utilitzen props per comunicar-se entre ells. Cada component pare pot enviar informació als seus components fills mitjançant l’ús de props.
Les props són les dades que es passen a un element TSX.
Per exemple, className, src i alt són algunes de les props que es poden passar a un element <img/>:
return
className="img-fluid"
src="https://shorturl.at/tQoUY"
alt="Rough Collie"
/>
</>
)
}Les props que pots utilitzar amb un element <img/> estan predefinides (ReactDOM s’ajusta a l’estàndard HTML).
No obstant això, pots passar qualsevol prop als teus propis components per personalitzar-los.
Passar props a un component
En aquest codi, el component App no està passant cap prop al seu component fill, Greeting:
return
}
return
}🧔 Hello David!
El més lògic seria que el component pare passés al component fill el nom i l’emoji.
Primer, passa les props name i emoji a l’element Greeting.
return
}El component Greeting accepta aquestes props especificant els seus noms name i emoji separats per comes dins de ({ i }):
return
}Ara el component Greeting pot saludar correctament:
👩🦰 Hello Laura!
Les props compleixen el mateix paper que els arguments d’una funció — de fet, les props són l’únic argument del teu component!
Les funcions dels components de React accepten un únic argument, un objecte props:
return
}En general, no necessites accedir a l’objecte complet de props, per això pots desestructurar-lo en props individuals:
...
}Aquesta sintaxi es coneix com a “desestructuració”.
Assignar un valor predeterminat per a una prop
Si vols assignar un valor predeterminat per a una prop en cas que no s’especifiqui cap valor, pots fer-ho mitjançant la desestructuració col·locant = seguit del valor predeterminat just després del paràmetre:
return
}Fixa’t que ara el tipus de props és { name: string, emoji?: string }, emoji és opcional.
Ara, si renderitzes Greeting sense la prop emoji, el valor d’emoji s’establirà automàticament a "👽".
return
}👽 Hello Armengol!
I ja tens un component completament reutilitzable:
return
</>
)
}🧙♂️ Hello Miquel!
👽 Hello Armengol!
🐱 Hello Nuria!
Renderització
Una aplicació de React està formada per molts components nidats entre si.
React, com a framework d’UI, és independent de la plataforma, i una aplicació React es pot renderitzar a la web, la qual utilitza marcat HTML com les seves primitives, o podria renderitzar-se en una plataforma mòbil o d’escriptori, que podria utilitzar diferents primitives d’UI.
Estructura d’arbre
Igual que els navegadors i les plataformes mòbils, React utilitza estructures d’arbre per gestionar i modelar la relació entre els components en una aplicació de React.
Una característica important dels components és la capacitat de compondre components d’altres components. En nidar components, tenim el concepte de components pare i fill, on cada component pare pot ser alhora un fill d’un altre component.
Quan renderitzem una aplicació de React, podem modelar aquesta relació en un arbre, conegut com l’arbre de renderització.
El node arrel en un arbre de renderització de React és el component arrel de l’aplicació. En aquest cas, el component arrel és App i és el primer component que React renderitza. Cada fletxa en l’arbre apunta des d’un component pare cap a un component fill.
- L’arbre de renderització està compost únicament per components de React.
- Un arbre de renderització representa una única passada de renderització d’una aplicació de React.
- Amb renderització condicional, un component pare pot renderitzar diferents fills depenent de les dades passades.
- L’arbre de renderització pot ser diferent per a cada passada de renderització.
Components purs
React està dissenyat amb la suposició que cada component que escrius és una funció pura.
Això significa que un component sempre ha de retornar el mateix TSX donades les mateixes entrades, i no canviar qualsevol objecte o variable que existís abans de renderitzar.
A continuació tens un component que trenca aquesta regla:
return
</div>
)
}
evil = ` `
return
}Pots veure que els emojis apareixen duplicats:
🤗 🧙♂️ 🧙♂️ Hello Miquel!
🤗 🧙♂️ 🧙♂️ 👽 👽 Hello Armengol!
🤗 🧙♂️ 🧙♂️ 👽 👽 🐱 🐱 Hello Nuria!
I més important, si canvies l’ordre dels Greeting, retornen un TSX diferent:
return
</div>
)
}🤗 🐱 🐱 Hello Nuria!
🤗 🐱 🐱 🧙♂️ 🧙♂️ Hello Miquel!
🤗 🐱 🐱 🧙♂️ 🧙♂️ 👽 👽 Hello Armengol!
Importar y exportar componentes
La magia de los componentes reside en su reusabilidad: puedes crear componentes que se componen a su vez de otros componentes.
Pero mientras anidas más y más componentes, a menudo tiene sentido comenzar a separarlos en diferentes archivos.
Crea un fichero src/Greeting.tsx:
return
}Importa Greeting con un import por defecto desde Greeting.tsx:
return
</div>
)
}Si quieres puedes canviar el nombre del componente cuando lo utilizas:
return
</div>
)
}En lugar de utilizar un export por defecto puedes utilitzar un export por nombre (sin la palabra clave default):
return
}Ahora tienes que importar el componente Greeting usando un import con nombre (con llaves):
return
</div>
)
}¡Un archivo solo puede contener un export por defecto, pero puede tener múltiples exports con nombre!
Librerias
Hay muchas librerías de react que puedes utilizar: Awesome React Components.
Pigeon Maps - Docs te proporciona un componente que te permite añadir mapas sin dependencias externas.
Instala la librería pigeon-maps:
deno add npm:pigeon-mapsA continuación tenemos un mapa de Barcelona (Spain) con un marcador en la Sagrada Familia.
return
</Map>
</div>
)
}Actividades
1.- DogCard
- Crea un componente
DogCardcon las propiedadesname,descriptioneimage?. - La propiedad
image?tiene una imagen por defecto - Utiliza este componente para mostrar una colección de perros.
Show solution
return
name="Rough Collie"
description="A dog breed that's well-known for herding and protecting abilities, rough collie dogs are described as strong, loyal, affectionate, responsive, and fast."
image="https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Rough-Collie-japan08_%28cropped%29.jpg/1200px-Rough-Collie-japan08_%28cropped%29.jpg"/>
</div>
description="Affenpinscher dogs are best known for their expressive face, with a short muzzle and dark, round eyes that give them an appearance not unlike a monkey."/>
</div>
</div>
</div>
)
}
name: string,
description: string,
image?: string
}) return
src=
alt=/>
</div>
</div>
)
}2.- Happy.tsx
- Crea el fichero
Happy.tsxcon dos funciones con nombre:HappyNameyHappyImage. HappyNametiene una propiedadnamey muestra el nombre de forma divertida.HappyImagetiene una propiedadimagey muestra la imagen de forma divertida.- El componente
Apptiene que utilizar los dos componentes deHappy.tsx
Show solution
;
return
</div>
)
} return className=></span>
}
return
}3.- Pigeon Maps
- Busca en Internet las coordendas geográficas y un GeoJSON de París.
- Crea un mapa de París y alrededores marcando los límites de París.
Show solution
return
</Map>
</div>
</div>
)
}