Custom Hooks
Custom Hooks to funkcje JavaScript zaczynające się od use, które mogą wywoływać inne hooki. Pozwalają wyodrębnić powtarzającą się logikę komponentu (fetch, formularze, timery) do reużywalnych funkcji, bez zmiany struktury komponentów.
This content is not available in your language yet.
Custom Hooks
Custom Hooks to funkcje JavaScript zaczynające się od use, które mogą wywoływać inne hooki. Pozwalają wyodrębnić powtarzającą się logikę komponentu (fetch, formularze, timery) do reużywalnych funkcji, bez zmiany struktury komponentów.
useXxx enkapsulująca logikę z hookami Reactuse, zwracanie wartościSchemat
Przed: 3 komponenty z takim samym kodem fetch (30 linii każdy = 90 linii duplikacji). Po: 3 komponenty używające useFetch (3 linie każdy = 9 linii + 20 linii hooka = 29 linii). Oszczędność!
Przykład kodu JSX
Custom hook useFetch i dwa komponenty które go używają — pokazując eliminację duplikacji.
useFetch — prosty przykład pobierania danychForma: 10 slajdów, 10 minut
Ocena: 3.0useLocalStorage z pełnym przykłademuseDebounce dla wyszukiwarkiForma: 12-15 slajdów, 12 minut
Ocena: 4.0-5.0Forma: 15 slajdów + Q&A
Ocena: 5.0-6.0function useFetch(url) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null);
useEffect(() => { const controller = new AbortController(); fetch(url, { signal: controller.signal }) .then(res => res.json()) .then(setData) .catch(err => { if (err.name !== 'AbortError') setError(err.message); }) .finally(() => setLoading(false)); return () => controller.abort(); }, [url]);
return { data, loading, error };}
// Użycie w komponencie — czyste i proste!function UserList() { const { data: users, loading, error } = useFetch('/api/users'); if (loading) return <p>Ładowanie...</p>; if (error) return <p>Błąd: {error}</p>; return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>;}function useLocalStorage(key, initialValue) { const [value, setValue] = useState(() => { const stored = localStorage.getItem(key); return stored ? JSON.parse(stored) : initialValue; });
const setStoredValue = (newValue) => { setValue(newValue); localStorage.setItem(key, JSON.stringify(newValue)); };
return [value, setStoredValue];}
// Użycie: stan który przeżywa odświeżenie stronyfunction Settings() { const [darkMode, setDarkMode] = useLocalStorage('darkMode', false); return ( <button onClick={() => setDarkMode(!darkMode)}> {darkMode ? 'Jasny motyw' : 'Ciemny motyw'} </button> );}Pokaż refaktor
Zacznijcie od komponentu z 40 liniami logiki fetch, potem pokażcie jak po wydzieleniu do Custom Hooka komponent ma 8 linii. Wow-efekt gwarantowany!
Zasada nazewnictwa
Podkreślcie że use na początku to nie konwencja dekoracyjna — React używa tej nazwy do weryfikacji reguł hooków. Hook bez use w nazwie nie będzie walidowany przez ESLint.
Custom Hooks = DRY w React!
Każdy senior React developer tworzy własne hooki. To znak dojrzałości kodu. Po tej prezentacji klasie zrozumie jak pisać czysty, reużywalny kod!