React Hooks

Hooks sind eine neue Ergänzung in React 16.8. Mit ihnen kann Zustand und andere React-Features genutzt werden, ohne eine Klassenbasierte Komponente zu verwenden.

Vor React 16.8 war die einzige Möglichkeit, eine zustandsbehaftete Komponente zu erstellen, die Erstellung einer Komponente im Klassenstil, die einen Komponentenzustand über die state- und setState-Mitglieder der Component-Klasse bereitstellen kann.

useState Hook

Der erste Hook, den wir kennengelernt haben, war der useState-Hook aus dem Artikel über Zustandsbehaftete Komponenten.

const myComponent = () => {
const [counter, setCounter] = useState(0);
return (
<>
<div></div>
<button onClick={() => setCounter(counter => counter + 1)}> Increase</button>
</>
);
};

Vorteile von React Hooks

useEffect hook

Mit dem useEffect-Hook können Sie Seiteneffekte auf Komponenten ausführen und Operationen durchführen, wenn eine Komponente eingehängt oder ausgehängt wird oder sich ein abhängiger Wert geändert hat. Dies kann für das Abrufen von Daten verwendet werden.

const MyComponent = () => {
const [data, setData] = useState(null);

useEffect(() => {
// wird nach dem Mounten einer Komponente ausgeführt
const controller = new AbortController();
const { signal } = controller();
fetch("https://yesno.wtf/api", { signal })
.then(res => res.json())
.then(data => {
const { answer, image } = data;
setData({answer, image});
});

// Wird beim Unmounten ausgeführt.
return () => {
// Abbruch des Request, um zu verhindern dass setData aufgerüfen wird
// nachdem die Komponente zerstört wurde.
controller.abort();
}
}, []);

return (data ?
<>
<img src={data.image} alt={`The answer is ${data.answer}`}>
</> :
<>
<div>Loading</div>
</>
);
};

useMemo hook

Der useMemo-Hook hilft, einen Wert innerhalb einer Komponente zu zwischenzuspeichern.

Aufwändige Operationen wie das Filtern eines großen Arrays können große Auswirkungen auf die Performance der Anwendung haben. Mit useMemo kann sichergestellt werden, dass der Wert nur bei Bedarf neu berechnet wird:

Beispiel:

// a huge array of Pokemons:
const pokemons = [
'Bulbasaur',
'Ivysaur',
'Venusaur',
'Charmander',
'Charmeleon',
'Charizard',
'Squirtle',
'Wartortle',
'Blastoise',
'Caterpie',
];

const MyComponent = () => {
const [filter, setFilter] = useState('');
const filteredPokemons = useMemo(
() => pokemons.filter(it => it.toLowerCase().startsWith(filter.toLowerCase())),
[pokemons, filter] // dependency array.
);

// .filter ist eine potentiell teure Operation, wenn
// die Menge der Daten größer ist als in diesem Beispiel.
// die gefilterten Pokemon werden jedes Mal neu berechnet, wenn sich eine
// der Abhängigkeiten ändert

return (
<>
<input value={filter} onChange={(e) => setFilter(e.target.value)} />
<ul>
{filteredPokemons.map(pokemon => (<li key={pokemon}>{pokemon}</li>))}
</ul>
</>
);
};

useContext hook

Die "useContext"-Api hilft dabei, einen globalen Anwendungszustand über die Context-API zwischen Komponenten zu teilen. Die Kontext-API wird in einem eigenen Artikel beschrieben: Die Context API.