En aquest tema, aprendrem a construir la interfície d'usuari (UI) de la nostra aplicació React. Ens centrarem en la creació de components reutilitzables, l'ús de biblioteques d'estil i la implementació de bones pràctiques per a una UI neta i eficient.
Objectius
- Crear components reutilitzables.
- Utilitzar biblioteques d'estil com Styled Components o CSS Modules.
- Implementar bones pràctiques per a la construcció de la UI.
- Crear components reutilitzables
1.1. Què són els components reutilitzables?
Els components reutilitzables són blocs de codi que poden ser utilitzats en diferents parts de la nostra aplicació sense necessitat de duplicar codi. Això facilita el manteniment i l'escalabilitat de l'aplicació.
1.2. Exemple pràctic: Botó reutilitzable
Pas 1: Crear el component del botó
// src/components/Button.js import React from 'react'; import PropTypes from 'prop-types'; import './Button.css'; const Button = ({ label, onClick, type = 'button' }) => { return ( <button className="custom-button" onClick={onClick} type={type}> {label} </button> ); }; Button.propTypes = { label: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, type: PropTypes.oneOf(['button', 'submit', 'reset']), }; export default Button;
Pas 2: Estilitzar el component del botó
/* src/components/Button.css */ .custom-button { background-color: #007bff; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer; font-size: 16px; } .custom-button:hover { background-color: #0056b3; }
Pas 3: Utilitzar el component del botó
// src/App.js import React from 'react'; import Button from './components/Button'; const App = () => { const handleClick = () => { alert('Botó clicat!'); }; return ( <div> <h1>Benvingut a la nostra aplicació</h1> <Button label="Clica'm" onClick={handleClick} /> </div> ); }; export default App;
- Utilitzar biblioteques d'estil
2.1. Styled Components
Styled Components és una biblioteca que permet escriure CSS dins dels components de React utilitzant tagged template literals.
Exemple pràctic: Botó amb Styled Components
// src/components/Button.js import React from 'react'; import PropTypes from 'prop-types'; import styled from 'styled-components'; const StyledButton = styled.button` background-color: #007bff; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer; font-size: 16px; &:hover { background-color: #0056b3; } `; const Button = ({ label, onClick, type = 'button' }) => { return ( <StyledButton onClick={onClick} type={type}> {label} </StyledButton> ); }; Button.propTypes = { label: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, type: PropTypes.oneOf(['button', 'submit', 'reset']), }; export default Button;
2.2. CSS Modules
CSS Modules permeten escriure CSS que és local per a cada component, evitant conflictes de noms.
Exemple pràctic: Botó amb CSS Modules
// src/components/Button.js import React from 'react'; import PropTypes from 'prop-types'; import styles from './Button.module.css'; const Button = ({ label, onClick, type = 'button' }) => { return ( <button className={styles.customButton} onClick={onClick} type={type}> {label} </button> ); }; Button.propTypes = { label: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, type: PropTypes.oneOf(['button', 'submit', 'reset']), }; export default Button;
/* src/components/Button.module.css */ .customButton { background-color: #007bff; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer; font-size: 16px; } .customButton:hover { background-color: #0056b3; }
- Bones pràctiques per a la construcció de la UI
3.1. Separació de preocupacions
Mantingueu la lògica de la UI separada de la lògica de negoci. Utilitzeu components presentacionals per a la UI i components contenidors per a la lògica de negoci.
3.2. Nomenclatura clara
Utilitzeu noms clars i descriptius per als components i les classes CSS. Això facilita la comprensió i el manteniment del codi.
3.3. Reutilització de components
Creeu components reutilitzables sempre que sigui possible per evitar la duplicació de codi i facilitar el manteniment.
3.4. Estils modulars
Utilitzeu CSS Modules o Styled Components per evitar conflictes de noms i mantenir els estils locals als components.
Exercici pràctic
Objectiu
Crear un component de targeta reutilitzable que mostri informació d'un usuari.
Requisits
- El component ha de rebre les següents props:
name
,email
,avatar
. - Ha de mostrar el nom, el correu electrònic i una imatge d'avatar.
- Ha d'estar estilitzat utilitzant CSS Modules.
Solució
Pas 1: Crear el component de targeta
// src/components/UserCard.js import React from 'react'; import PropTypes from 'prop-types'; import styles from './UserCard.module.css'; const UserCard = ({ name, email, avatar }) => { return ( <div className={styles.card}> <img src={avatar} alt={`${name}'s avatar`} className={styles.avatar} /> <div className={styles.info}> <h2 className={styles.name}>{name}</h2> <p className={styles.email}>{email}</p> </div> </div> ); }; UserCard.propTypes = { name: PropTypes.string.isRequired, email: PropTypes.string.isRequired, avatar: PropTypes.string.isRequired, }; export default UserCard;
Pas 2: Estilitzar el component de targeta
/* src/components/UserCard.module.css */ .card { border: 1px solid #ddd; border-radius: 10px; padding: 20px; display: flex; align-items: center; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } .avatar { border-radius: 50%; width: 60px; height: 60px; margin-right: 20px; } .info { display: flex; flex-direction: column; } .name { font-size: 18px; margin: 0; } .email { font-size: 14px; color: #555; }
Pas 3: Utilitzar el component de targeta
// src/App.js import React from 'react'; import UserCard from './components/UserCard'; const App = () => { const user = { name: 'John Doe', email: '[email protected]', avatar: 'https://via.placeholder.com/60', }; return ( <div> <h1>Llista d'usuaris</h1> <UserCard name={user.name} email={user.email} avatar={user.avatar} /> </div> ); }; export default App;
Conclusió
En aquesta secció, hem après a construir la interfície d'usuari de la nostra aplicació React utilitzant components reutilitzables i biblioteques d'estil com Styled Components i CSS Modules. També hem implementat bones pràctiques per a la construcció de la UI. A la següent secció, ens centrarem en la gestió de l'estat i la integració de l'API.
Curs de React
Mòdul 1: Introducció a React
- Què és React?
- Configuració de l'entorn de desenvolupament
- Hola Món en React
- JSX: Extensió de la sintaxi de JavaScript
Mòdul 2: Components de React
- Comprendre els components
- Components funcionals vs components de classe
- Props: Passar dades als components
- State: Gestionar l'estat del component
Mòdul 3: Treballar amb esdeveniments
- Gestionar esdeveniments en React
- Renderització condicional
- Llistes i claus
- Formularis i components controlats
Mòdul 4: Conceptes avançats de components
- Elevar l'estat
- Composició vs herència
- Mètodes del cicle de vida de React
- Hooks: Introducció i ús bàsic
Mòdul 5: Hooks de React
Mòdul 6: Enrutament en React
Mòdul 7: Gestió de l'estat
- Introducció a la gestió de l'estat
- API de context
- Redux: Introducció i configuració
- Redux: Accions i reductors
- Redux: Connexió amb React
Mòdul 8: Optimització del rendiment
- Tècniques d'optimització del rendiment de React
- Memorització amb React.memo
- Hooks useMemo i useCallback
- Divisió de codi i càrrega mandrosa
Mòdul 9: Proves en React
- Introducció a les proves
- Proves unitàries amb Jest
- Proves de components amb React Testing Library
- Proves de punta a punta amb Cypress
Mòdul 10: Temes avançats
- Renderització del costat del servidor (SSR) amb Next.js
- Generació de llocs estàtics (SSG) amb Next.js
- TypeScript amb React
- React Native: Construir aplicacions mòbils