ReactJS – useEffect()
⚙️ Część 1: Wprowadzenie
useEffect to hook, który umożliwia wykonywanie efektów ubocznych w komponentach React. Dzięki niemu można reagować na zmiany danych, pobierać dane z API, ustawiać timery lub manipulować elementami DOM po renderze.
Efekt uboczny (ang. side effect) to każda operacja, która wychodzi poza sam proces renderowania – np. pobranie danych, zmiana tytułu strony, subskrypcja zdarzeń czy zapis w localStorage.
Najczęstsze zastosowania:
- Pobieranie danych z API
- Reagowanie na zmiany stanu lub propsów
- Subskrypcje i czyszczenie zasobów (np. event listenerów)
- Manipulacja DOM po renderze
📚 Część 2: Co to jest useEffect
useEffect(() => {
// kod, który ma się wykonać po renderze
}, [zależności]);
| Element | Opis |
|---|---|
| Funkcja efektu | Kod wykonywany po wyrenderowaniu komponentu |
| Tablica zależności | Lista wartości, po zmianie których efekt się uruchamia |
| Pusty efekt | Jeśli tablica zależności jest pusta [], efekt wykona się tylko raz – przy montowaniu |
| Czyszczenie | Można zwrócić funkcję, która wykona się przy odmontowaniu |
💡 Część 3: Praktyczne przykłady
✅ Przykład 1: Efekt przy montowaniu komponentu
import React, { useEffect } from 'react';
function Montowanie() {
useEffect(() => {
console.log('Komponent został zamontowany');
}, []);
return <p>Sprawdź konsolę po załadowaniu komponentu</p>;
}
export default Montowanie;
Pusty drugi argument [] oznacza, że efekt wykona się tylko raz — po pierwszym renderze komponentu.
✅ Przykład 2: Efekt reagujący na zmianę stanu
import React, { useState, useEffect } from 'react';
function ZmianaStanu() {
const [licznik, setLicznik] = useState(0);
useEffect(() => {
console.log('Licznik się zmienił:', licznik);
}, [licznik]);
return (
<div>
<p>Wartość: {licznik}</p>
<button onClick={() => setLicznik(licznik + 1)}>Zwiększ</button>
</div>
);
}
export default ZmianaStanu;
Efekt wykonuje się za każdym razem, gdy zmieni się stan licznik. Tablica [licznik] określa zależność.
✅ Przykład 3: Pobieranie danych z API
import React, { useEffect, useState } from 'react';
function PobierzDane() {
const [dane, setDane] = useState([]);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/users')
.then(response => response.json())
.then(data => setDane(data));
}, []);
return (
<div>
<h3>Użytkownicy:</h3>
<ul>
{dane.map(u => <li key={u.id}>{u.name}</li>)}
</ul>
</div>
);
}
export default PobierzDane;
useEffect pobiera dane tylko raz przy montowaniu. Po otrzymaniu danych aktualizuje stan i komponent renderuje się ponownie z nową zawartością.
✅ Przykład 4: Efekt z czyszczeniem
import React, { useEffect, useState } from 'react';
function Zegar() {
const [czas, setCzas] = useState(new Date().toLocaleTimeString());
useEffect(() => {
const interval = setInterval(() => {
setCzas(new Date().toLocaleTimeString());
}, 1000);
return () => clearInterval(interval);
}, []);
return <p>Aktualny czas: {czas}</p>;
}
export default Zegar;
Efekt ustawia interwał, który aktualizuje godzinę co sekundę. Funkcja zwrócona z useEffect czyści interwał po odmontowaniu komponentu, zapobiegając błędom.
✅ Przykład 5: Obsługa zdarzenia i e.target.value
import React, { useState, useEffect } from 'react';
function EfektInput() {
const [tekst, setTekst] = useState('');
const [dlugosc, setDlugosc] = useState(0);
function zmien(e) {
setTekst(e.target.value);
}
useEffect(() => {
setDlugosc(tekst.length);
}, [tekst]);
return (
<div>
<input
type="text"
value={tekst}
onChange={zmien}
placeholder="Wpisz coś..."
style={{ padding: '8px', marginRight: '10px' }}
/>
<p>Długość tekstu: {dlugosc}</p>
</div>
);
}
export default EfektInput;
onChangeprzekazuje wartość z inputa poprzeze.target.value.useEffectreaguje na zmianę stanuteksti aktualizuje jego długość.- Stan i efekt współpracują, tworząc dynamiczne zachowanie komponentu.
📌 Podsumowanie
| # | Punkt | Szczegóły |
|---|---|---|
| 1 | useEffect | Hook do wykonywania efektów ubocznych w komponentach funkcyjnych |
| 2 | Tablica zależności | Określa, kiedy efekt ma się wykonać ponownie |
| 3 | Pusty efekt | Efekt wykona się tylko raz, przy pierwszym renderze |
| 4 | Czyszczenie | Funkcja zwrócona z efektu działa przy odmontowaniu komponentu |
| 5 | Zastosowania | Pobieranie danych, timery, nasłuchiwanie zdarzeń, synchronizacja z lokalnym stanem |
🏆 Dobre praktyki:
✓ Używaj [] jeśli efekt ma wykonać się tylko raz
✓ Dodawaj wszystkie zależności, których używa efekt
✓ Czyść zasoby (interwały, eventy) w funkcji zwrotnej
✓ Nie uruchamiaj efektów warunkowo w środku komponentu
