Introducció
El hook useEffect és un dels hooks més utilitzats en React. Permet realitzar efectes secundaris en components funcionals, com ara la recuperació de dades, la subscripció a serveis, o la manipulació directa del DOM. És una alternativa als mètodes del cicle de vida dels components de classe, com componentDidMount, componentDidUpdate i componentWillUnmount.
Conceptes Clau
- Efectes secundaris: Operacions que afecten fora del component, com ara crides a API, subscripcions, o actualitzacions del DOM.
- Dependències: Variables que, quan canvien, provoquen que l'efecte es torni a executar.
Sintaxi Bàsica
import React, { useEffect } from 'react';
function ExampleComponent() {
useEffect(() => {
// Codi de l'efecte
console.log('Component muntat o actualitzat');
// Opcional: neteja de l'efecte
return () => {
console.log('Component desmuntat o actualitzat');
};
}, []); // Array de dependències
return <div>Hola, món!</div>;
}Explicació del Codi
- Importació: Importem
useEffectdes de React. - Declaració del component: Definim un component funcional
ExampleComponent. - useEffect:
- El primer argument és una funció que conté el codi de l'efecte.
- El segon argument és un array de dependències. Si està buit (
[]), l'efecte només s'executa una vegada després del muntatge del component. - La funció retornada dins de
useEffectés opcional i s'utilitza per netejar l'efecte quan el component es desmunta o abans de tornar a executar l'efecte.
Exemples Pràctics
Exemple 1: Recuperació de Dades
import React, { useState, useEffect } from 'react';
function DataFetchingComponent() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => setData(data))
.catch(error => console.error('Error:', error));
}, []); // L'efecte només s'executa una vegada
return (
<div>
{data ? <pre>{JSON.stringify(data, null, 2)}</pre> : 'Carregant...'}
</div>
);
}Exemple 2: Subscripció a un Servei
import React, { useState, useEffect } from 'react';
function SubscriptionComponent() {
const [message, setMessage] = useState('');
useEffect(() => {
const subscription = someService.subscribe(newMessage => {
setMessage(newMessage);
});
// Neteja de la subscripció
return () => {
subscription.unsubscribe();
};
}, []); // L'efecte només s'executa una vegada
return <div>{message}</div>;
}Exemple 3: Efecte amb Dependències
import React, { useState, useEffect } from 'react';
function CounterComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Has clicat ${count} vegades`;
}, [count]); // L'efecte s'executa cada vegada que 'count' canvia
return (
<div>
<p>Has clicat {count} vegades</p>
<button onClick={() => setCount(count + 1)}>Clica'm</button>
</div>
);
}Exercicis Pràctics
Exercici 1: Temporitzador
Crea un component que mostri un temporitzador que s'incrementa cada segon.
Solució
import React, { useState, useEffect } from 'react';
function TimerComponent() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setSeconds(prevSeconds => prevSeconds + 1);
}, 1000);
// Neteja de l'interval
return () => clearInterval(interval);
}, []);
return <div>Segons: {seconds}</div>;
}Exercici 2: Finestra de Dimensions
Crea un component que mostri les dimensions de la finestra i actualitzi les dimensions quan la finestra es redimensiona.
Solució
import React, { useState, useEffect } from 'react';
function WindowDimensionsComponent() {
const [dimensions, setDimensions] = useState({
width: window.innerWidth,
height: window.innerHeight
});
useEffect(() => {
const handleResize = () => {
setDimensions({
width: window.innerWidth,
height: window.innerHeight
});
};
window.addEventListener('resize', handleResize);
// Neteja de l'event listener
return () => window.removeEventListener('resize', handleResize);
}, []);
return (
<div>
Amplada: {dimensions.width}px, Alçada: {dimensions.height}px
</div>
);
}Errors Comuns i Consells
- Oblidar les dependències: Si oblides afegir dependències, l'efecte pot no comportar-se com esperes. Assegura't d'incloure totes les variables que utilitzes dins de l'efecte.
- Neteja inadequada: Si el teu efecte necessita neteja (per exemple, desubscripcions o neteja de temporitzadors), assegura't de retornar una funció de neteja dins de
useEffect. - Efectes infinits: Evita crear efectes que es repeteixin infinitament. Això pot passar si canvies l'estat dins de l'efecte sense tenir en compte les dependències correctes.
Conclusió
El hook useEffect és una eina poderosa per gestionar efectes secundaris en components funcionals de React. Comprendre com utilitzar-lo correctament és essencial per escriure components reactius i eficients. Amb la pràctica, podràs utilitzar useEffect per gestionar una àmplia varietat de casos d'ús en les teves aplicacions React.
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
