React hooky jsou funkce, které umožňují React komponentám používat stav a další funkcionality bez nutnosti používání třídních komponent. Vznikly v React verzi 16.8 s cílem zjednodušit práci s komponentami, zlepšit znovupoužitelnost kódu a zvýšit čitelnost.
K pochopení každého z hooku je potřeba mít v hlavě aspoň základní podstatu react renderování.
je nejzákladnější React hook pro správu stavu ve funkcionálních komponentách. Pomocí useState můžeme vytvořit stavovou proměnnou a funkci pro její aktualizaci.
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
//zobrazení proměnné
<p>You clicked {count} times</p>
//změna proměnné
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}
defaultní hodnota: hodnota, která se zadá do parametrů hooku
count: samotná proměnná
setCount: funkce na manipulování proměnné, do parametru se zadá nová hodnota a komponenta se aktualizuje
Pokud zadáte kus kódu přímo do komponenty, tak se spustí kdykoliv, když se komponenta aktualizuje, což vám může přijít draho pokud třeba voláte api endpoint.
import React, { useState, useEffect } from 'react';
const ExampleComponent = () => {
const [count, setCount] = useState(0);
useEffect(() => {
// Spustí se při prvním "mount" komponenty
console.log('Komponenta byla vykreslena.');
return () => {
console.log('Cleanup funkce byla provedena.');
};
// funkce se znova spustí jen pokud se změní count
},[count]);
return (
<div>
<p>Hodnota count: {count}</p>
<button onClick={() => setCount(count + 1)}>Zvýšit count</button>
</div>
);
};
export default ExampleComponent;
Pokud máte funkci, která je výpočetně náročná, výsledek se bude vypočítávat při každé aktualizaci komponetny. Za použití useMemo se ale vypočítá při přidání do ui a kdykoliv se změní zadané parametry.
import React, { useMemo } from 'react';
const ExampleComponent = () => {
const [count, setCount] = useState(0);
// funkce se zvova vypočítá jen při změně count
const doubleCount = useMemo(() => {
console.log('Calculating double count...');
return count * 2;
}, [count]);
return (
<div>
<p>Hodnota count: {count}</p>
<p>Double count: {doubleCount}</p>
</div>
);
};
export default ExampleComponent;
Se používá stejně jako useMeno, ale memoizuje se funkce.
import React, { useState, useCallback } from 'react';
const Button = ({ handleClick, children }) => {
return <button onClick={handleClick}>{children}</button>;
};
const ExampleComponent = () => {
const [count, setCount] = useState(0);
// handleClick se znovu vytvoří jen při změně count
const handleClick = useCallback(() => {
console.log('Button clicked!');
setCount(prevCount => prevCount + 1);
}, [count]);
return (
<div>
<p>Count value: {count}</p>
<Button handleClick={handleClick}>Increase count</Button>
</div>
);
};
export default ExampleComponent;
Do useRef se přidá defaultní proměnná a countRef zůstane stejný, i když se komponenta aktualizuje při zavolání setCount.
import React, { useState, useRef } from 'react';
const ExampleComponent = () => {
const [count, setCount] = useState(0);
const countRef = useRef(0);
const incrementCount = () => {
setCount(prevCount => prevCount + 1);
};
return (
<div>
<p>Count value: {count}</p>
<p>Count value (ref): {countRef.current}</p>
<button onClick={incrementCount}>Increase count</button>
</div>
);
};
export default ExampleComponent;
Defaultní hodnota: 0