Leer hoe je React aangepaste hooks kunt optimaliseren door afhankelijkheden in useEffect te begrijpen en te beheren. Verbeter de prestaties en vermijd veelvoorkomende valkuilen.
React Aangepaste Hook Afhankelijkheden: Effectoptimalisatie voor Prestaties Onder de Knie Krijgen
React aangepaste hooks zijn een krachtig hulpmiddel voor het abstraheren en hergebruiken van logica in uw componenten. Een onjuiste omgang met afhankelijkheden binnen `useEffect` kan echter leiden tot prestatieproblemen, onnodige re-renders en zelfs oneindige loops. Deze handleiding biedt een uitgebreid begrip van `useEffect`-afhankelijkheden en best practices voor het optimaliseren van uw aangepaste hooks.
useEffect en Afhankelijkheden Begrijpen
Met de `useEffect`-hook in React kunt u neveneffecten uitvoeren in uw componenten, zoals het ophalen van gegevens, DOM-manipulatie of het instellen van abonnementen. Het tweede argument voor `useEffect` is een optionele array van afhankelijkheden. Deze array vertelt React wanneer het effect opnieuw moet worden uitgevoerd. Als een van de waarden in de afhankelijkhedenarray verandert tussen renders, wordt het effect opnieuw uitgevoerd. Als de afhankelijkhedenarray leeg is (`[]`), wordt het effect slechts één keer uitgevoerd na de eerste render. Als de afhankelijkhedenarray helemaal wordt weggelaten, wordt het effect na elke render uitgevoerd.
Waarom Afhankelijkheden Belangrijk Zijn
Afhankelijkheden zijn cruciaal voor het bepalen wanneer uw effect wordt uitgevoerd. Als u een afhankelijkheid opneemt die het effect eigenlijk niet hoeft te activeren, krijgt u onnodige heruitvoeringen, wat mogelijk de prestaties beïnvloedt. Omgekeerd, als u een afhankelijkheid weglaat die *wel* het effect moet activeren, wordt uw component mogelijk niet correct bijgewerkt, wat leidt tot bugs en onverwacht gedrag. Laten we eens kijken naar een basisvoorbeeld:
import React, { useState, useEffect } from 'react';
function ExampleComponent({ userId }) {
const [userData, setUserData] = useState(null);
useEffect(() => {
async function fetchData() {
const response = await fetch(`https://api.example.com/users/${userId}`);
const data = await response.json();
setUserData(data);
}
fetchData();
}, [userId]); // Afhankelijkhedenarray: wordt alleen opnieuw uitgevoerd wanneer userId verandert
if (!userData) {
return Loading...
;
}
return (
{userData.name}
{userData.email}
);
}
export default ExampleComponent;
In dit voorbeeld haalt het effect gebruikersgegevens op van een API. De afhankelijkhedenarray bevat `userId`. Dit zorgt ervoor dat het effect alleen wordt uitgevoerd wanneer de `userId`-prop verandert. Als `userId` hetzelfde blijft, wordt het effect niet opnieuw uitgevoerd, waardoor onnodige API-aanroepen worden voorkomen.
Veelvoorkomende Valkuilen en Hoe Ze Te Vermijden
Er kunnen verschillende veelvoorkomende valkuilen ontstaan bij het werken met `useEffect`-afhankelijkheden. Het begrijpen van deze valkuilen en hoe ze te vermijden is essentieel voor het schrijven van efficiënte en bugvrije React-code.
1. Ontbrekende Afhankelijkheden
De meest gemaakte fout is het weglaten van een afhankelijkheid die *wel* in de afhankelijkhedenarray moet worden opgenomen. Dit kan leiden tot verouderde closures en onverwacht gedrag. Bijvoorbeeld:
import React, { useState, useEffect } from 'react';
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
const intervalId = setInterval(() => {
setCount(count + 1); // Potentieel probleem: `count` is geen afhankelijkheid
}, 1000);
return () => clearInterval(intervalId);
}, []); // Lege afhankelijkhedenarray: effect wordt slechts één keer uitgevoerd
return Count: {count}
;
}
export default Counter;
In dit voorbeeld is de variabele `count` niet opgenomen in de afhankelijkhedenarray. Als gevolg hiervan gebruikt de `setInterval`-callback altijd de beginwaarde van `count` (die 0 is). De teller wordt niet correct verhoogd. De correcte versie zou `count` in de afhankelijkhedenarray moeten bevatten:
import React, { useState, useEffect } from 'react';
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
const intervalId = setInterval(() => {
setCount(prevCount => prevCount + 1); // Correct: gebruik functionele update
}, 1000);
return () => clearInterval(intervalId);
}, []); // Nu is er geen afhankelijkheid nodig omdat we de functionele update vorm gebruiken.
return Count: {count}
;
}
export default Counter;
Geleerde Les: Zorg er altijd voor dat alle variabelen die in het effect worden gebruikt en die buiten het effect zijn gedefinieerd, in de afhankelijkhedenarray zijn opgenomen. Gebruik indien mogelijk functionele updates (`setCount(prevCount => prevCount + 1)`) om te voorkomen dat de `count`-afhankelijkheid nodig is.
2. Onnodige Afhankelijkheden Opnemen
Het opnemen van onnodige afhankelijkheden kan leiden tot overmatige re-renders en prestatievermindering. Beschouw bijvoorbeeld een component die een prop ontvangt die een object is:
import React, { useState, useEffect } from 'react';
function DisplayData({ data }) {
const [processedData, setProcessedData] = useState(null);
useEffect(() => {
// Voer een complexe gegevensverwerking uit
const result = processData(data);
setProcessedData(result);
}, [data]); // Probleem: `data` is een object, dus het verandert bij elke render
function processData(data) {
// Complexe logica voor gegevensverwerking
return data;
}
if (!processedData) {
return Loading...
;
}
return {processedData.value}
;
}
export default DisplayData;
In dit geval wordt, zelfs als de inhoud van het `data`-object logisch hetzelfde blijft, een nieuw object gemaakt bij elke render van de bovenliggende component. Dit betekent dat `useEffect` bij elke render opnieuw wordt uitgevoerd, zelfs als de gegevensverwerking niet opnieuw hoeft te worden uitgevoerd. Hier zijn een paar strategieën om dit op te lossen:
Oplossing 1: Memoïsatie met `useMemo`
Gebruik `useMemo` om de `data`-prop te memoïseren. Dit zal het `data`-object alleen opnieuw maken als de relevante eigenschappen veranderen.
import React, { useState, useEffect, useMemo } from 'react';
function ParentComponent() {
const [value, setValue] = useState(0);
// Memoïseer het `data`-object
const data = useMemo(() => ({ value }), [value]);
return ;
}
function DisplayData({ data }) {
const [processedData, setProcessedData] = useState(null);
useEffect(() => {
// Voer een complexe gegevensverwerking uit
const result = processData(data);
setProcessedData(result);
}, [data]); // Nu verandert `data` alleen wanneer `value` verandert
function processData(data) {
// Complexe logica voor gegevensverwerking
return data;
}
if (!processedData) {
return Loading...
;
}
return {processedData.value}
;
}
export default ParentComponent;
Oplossing 2: Destructurering van de Prop
Geef afzonderlijke eigenschappen van het `data`-object door als props in plaats van het hele object. Hierdoor kan `useEffect` alleen opnieuw worden uitgevoerd wanneer de specifieke eigenschappen waarop het afhankelijk is, veranderen.
import React, { useState, useEffect } from 'react';
function ParentComponent() {
const [value, setValue] = useState(0);
return ; // Geef `value` direct door
}
function DisplayData({ value }) {
const [processedData, setProcessedData] = useState(null);
useEffect(() => {
// Voer een complexe gegevensverwerking uit
const result = processData(value);
setProcessedData(result);
}, [value]); // Wordt alleen opnieuw uitgevoerd wanneer `value` verandert
function processData(value) {
// Complexe logica voor gegevensverwerking
return { value }; // Wikkel in object indien nodig in DisplayData
}
if (!processedData) {
return Loading...
;
}
return {processedData.value}
;
}
export default ParentComponent;
Oplossing 3: `useRef` Gebruiken om Waarden te Vergelijken
Als u de *inhoud* van het `data`-object moet vergelijken en het effect alleen opnieuw moet uitvoeren wanneer de inhoud verandert, kunt u `useRef` gebruiken om de vorige waarde van `data` op te slaan en een diepgaande vergelijking uit te voeren.
import React, { useState, useEffect, useRef } from 'react';
import { isEqual } from 'lodash'; // Vereist lodash-bibliotheek (npm install lodash)
function DisplayData({ data }) {
const [processedData, setProcessedData] = useState(null);
const previousData = useRef(data);
useEffect(() => {
if (!isEqual(data, previousData.current)) {
// Voer een complexe gegevensverwerking uit
const result = processData(data);
setProcessedData(result);
previousData.current = data;
}
}, [data]); // `data` staat nog steeds in de afhankelijkhedenarray, maar we controleren op diepe gelijkheid
function processData(data) {
// Complexe logica voor gegevensverwerking
return data;
}
if (!processedData) {
return Loading...
;
}
return {processedData.value}
;
}
export default DisplayData;
Let op: Diepe vergelijkingen kunnen duur zijn, dus gebruik deze aanpak met mate. Dit voorbeeld is ook afhankelijk van de `lodash`-bibliotheek. U kunt deze installeren met `npm install lodash` of `yarn add lodash`.
Geleerde Les: Overweeg zorgvuldig welke afhankelijkheden echt nodig zijn. Vermijd het opnemen van objecten of arrays die bij elke render opnieuw worden gemaakt als de inhoud logisch hetzelfde blijft. Gebruik memoïsatie, destructurering of diepe vergelijkingstechnieken om de prestaties te optimaliseren.
3. Oneindige Loops
Het onjuist beheren van afhankelijkheden kan leiden tot oneindige loops, waarbij de `useEffect`-hook continu opnieuw wordt uitgevoerd, waardoor uw component vastloopt of crasht. Dit gebeurt vaak wanneer het effect een statusvariabele bijwerkt die ook een afhankelijkheid is van het effect. Bijvoorbeeld:
import React, { useState, useEffect } from 'react';
function InfiniteLoop() {
const [data, setData] = useState(null);
useEffect(() => {
// Haal gegevens op van een API
fetch('https://api.example.com/data')
.then(response => response.json())
.then(result => {
setData(result); // Update `data`-status
});
}, [data]); // Probleem: `data` is een afhankelijkheid, dus het effect wordt opnieuw uitgevoerd wanneer `data` verandert
if (!data) {
return Loading...
;
}
return {data.value}
;
}
export default InfiniteLoop;
In dit voorbeeld haalt het effect gegevens op en stelt het in op de `data`-statusvariabele. `data` is echter ook een afhankelijkheid van het effect. Dit betekent dat elke keer dat `data` wordt bijgewerkt, het effect opnieuw wordt uitgevoerd, opnieuw gegevens ophaalt en `data` opnieuw instelt, wat leidt tot een oneindige loop. Er zijn verschillende manieren om dit op te lossen:
Oplossing 1: Lege Afhankelijkhedenarray (Alleen Eerste Keer Laden)
Als u de gegevens slechts één keer wilt ophalen wanneer de component wordt geladen, kunt u een lege afhankelijkhedenarray gebruiken:
import React, { useState, useEffect } from 'react';
function InfiniteLoop() {
const [data, setData] = useState(null);
useEffect(() => {
// Haal gegevens op van een API
fetch('https://api.example.com/data')
.then(response => response.json())
.then(result => {
setData(result);
});
}, []); // Lege afhankelijkhedenarray: effect wordt slechts één keer uitgevoerd
if (!data) {
return Loading...
;
}
return {data.value}
;
}
export default InfiniteLoop;
Oplossing 2: Gebruik een Aparte Status voor Laden
Gebruik een aparte statusvariabele om bij te houden of de gegevens zijn geladen. Dit voorkomt dat het effect opnieuw wordt uitgevoerd wanneer de `data`-status verandert.
import React, { useState, useEffect } from 'react';
function InfiniteLoop() {
const [data, setData] = useState(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
if (isLoading) {
// Haal gegevens op van een API
fetch('https://api.example.com/data')
.then(response => response.json())
.then(result => {
setData(result);
setIsLoading(false);
});
}
}, [isLoading]); // Wordt alleen opnieuw uitgevoerd wanneer `isLoading` verandert
if (!data) {
return Loading...
;
}
return {data.value}
;
}
export default InfiniteLoop;
Oplossing 3: Conditioneel Gegevens Ophalen
Haal de gegevens alleen op als deze momenteel null zijn. Dit voorkomt volgende fetches nadat de eerste gegevens zijn geladen.
import React, { useState, useEffect } from 'react';
function InfiniteLoop() {
const [data, setData] = useState(null);
useEffect(() => {
if (!data) {
// Haal gegevens op van een API
fetch('https://api.example.com/data')
.then(response => response.json())
.then(result => {
setData(result);
});
}
}, [data]); // `data` is nog steeds een afhankelijkheid, maar het effect is voorwaardelijk
if (!data) {
return Loading...
;
}
return {data.value}
;
}
export default InfiniteLoop;
Geleerde Les: Wees uiterst voorzichtig bij het bijwerken van een statusvariabele die ook een afhankelijkheid is van het effect. Gebruik lege afhankelijkhedenarrays, aparte laadstatussen of conditionele logica om oneindige loops te voorkomen.
4. Veranderlijke Objecten en Arrays
Bij het werken met veranderlijke objecten of arrays als afhankelijkheden, zullen wijzigingen in de objecteigenschappen of array-elementen het effect niet automatisch activeren. Dit komt omdat React een ondiepe vergelijking van de afhankelijkheden uitvoert.
import React, { useState, useEffect } from 'react';
function MutableObject() {
const [config, setConfig] = useState({ theme: 'light', language: 'en' });
useEffect(() => {
console.log('Config changed:', config);
}, [config]); // Probleem: Wijzigingen in `config.theme` of `config.language` activeren het effect niet
const toggleTheme = () => {
// Het object muteren
config.theme = config.theme === 'light' ? 'dark' : 'light';
setConfig(config); // Dit activeert geen re-render of het effect
};
return (
Theme: {config.theme}, Language: {config.language}
);
}
export default MutableObject;
In dit voorbeeld wijzigt de functie `toggleTheme` het `config`-object direct, wat een slechte gewoonte is. React's ondiepe vergelijking ziet dat `config` nog steeds hetzelfde object in het geheugen is, ook al zijn de eigenschappen gewijzigd. Om dit op te lossen, moet u een nieuw object maken bij het bijwerken van de status:
import React, { useState, useEffect } from 'react';
function MutableObject() {
const [config, setConfig] = useState({ theme: 'light', language: 'en' });
useEffect(() => {
console.log('Config changed:', config);
}, [config]); // Nu wordt het effect geactiveerd wanneer `config` verandert
const toggleTheme = () => {
setConfig({ ...config, theme: config.theme === 'light' ? 'dark' : 'light' }); // Maak een nieuw object
};
return (
Theme: {config.theme}, Language: {config.language}
);
}
export default MutableObject;
Door de spread operator (`...config`) te gebruiken, maken we een nieuw object met de bijgewerkte `theme`-eigenschap. Dit activeert een re-render en het effect wordt opnieuw uitgevoerd.
Geleerde Les: Behandel statusvariabelen altijd als onveranderlijk. Maak bij het bijwerken van objecten of arrays nieuwe instanties in plaats van bestaande te wijzigen. Gebruik de spread operator (`...`), `Array.map()`, `Array.filter()` of vergelijkbare technieken om nieuwe kopieën te maken.
Aangepaste Hooks Optimaliseren met Afhankelijkheden
Nu we de veelvoorkomende valkuilen begrijpen, laten we eens kijken hoe we aangepaste hooks kunnen optimaliseren door afhankelijkheden zorgvuldig te beheren.
1. Functies Memoïseren met `useCallback`
Als uw aangepaste hook een functie retourneert die wordt gebruikt als een afhankelijkheid in een andere `useEffect`, moet u de functie memoïseren met `useCallback`. Dit voorkomt dat de functie bij elke render opnieuw wordt gemaakt, wat het effect onnodig zou activeren.
import React, { useState, useEffect, useCallback } from 'react';
function useFetchData(url) {
const [data, setData] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const fetchData = useCallback(async () => {
setIsLoading(true);
try {
const response = await fetch(url);
const result = await response.json();
setData(result);
} catch (err) {
setError(err);
} finally {
setIsLoading(false);
}
}, [url]); // Memoïseer `fetchData` op basis van `url`
useEffect(() => {
fetchData();
}, [fetchData]); // Nu verandert `fetchData` alleen wanneer `url` verandert
return { data, isLoading, error };
}
function MyComponent() {
const [userId, setUserId] = useState(1);
const { data, isLoading, error } = useFetchData(`https://api.example.com/users/${userId}`);
return (
{/* ... */}
);
}
export default MyComponent;
In dit voorbeeld wordt de functie `fetchData` gememoïseerd met `useCallback`. De afhankelijkhedenarray bevat `url`, wat de enige variabele is die het gedrag van de functie beïnvloedt. Dit zorgt ervoor dat `fetchData` alleen verandert wanneer de `url` verandert. Daarom wordt de `useEffect`-hook in `useFetchData` alleen opnieuw uitgevoerd wanneer de `url` verandert.
2. `useRef` Gebruiken voor Stabiele Referenties
Soms moet u toegang hebben tot de nieuwste waarde van een prop of statusvariabele in een effect, maar wilt u niet dat het effect opnieuw wordt uitgevoerd wanneer die waarde verandert. In dit geval kunt u `useRef` gebruiken om een stabiele referentie naar de waarde te maken.
import React, { useState, useEffect, useRef } from 'react';
function LogLatestValue({ value }) {
const latestValue = useRef(value);
useEffect(() => {
latestValue.current = value; // Update de ref bij elke render
}, [value]); // Update de ref wanneer `value` verandert
useEffect(() => {
// Log de laatste waarde na 5 seconden
const timerId = setTimeout(() => {
console.log('Latest value:', latestValue.current); // Toegang tot de laatste waarde vanuit de ref
}, 5000);
return () => clearTimeout(timerId);
}, []); // Effect wordt slechts één keer uitgevoerd bij het laden
return Value: {value}
;
}
export default LogLatestValue;
In dit voorbeeld wordt de `latestValue`-ref bij elke render bijgewerkt met de huidige waarde van de `value`-prop. Het effect dat de waarde logt, wordt echter slechts één keer uitgevoerd bij het laden, dankzij de lege afhankelijkhedenarray. Binnen het effect hebben we toegang tot de laatste waarde met behulp van `latestValue.current`. Hierdoor hebben we toegang tot de meest actuele waarde van `value` zonder dat het effect telkens opnieuw wordt uitgevoerd wanneer `value` verandert.
3. Aangepaste Abstractie Creëren
Maak een aangepaste comparator of abstractie als u met een object werkt, en slechts een kleine subset van de eigenschappen is belangrijk voor de `useEffect`-aanroepen.
import React, { useState, useEffect } from 'react';
// Aangepaste comparator om alleen themawijzigingen bij te houden.
function useTheme(config) {
const [theme, setTheme] = useState(config.theme);
useEffect(() => {
setTheme(config.theme);
}, [config.theme]);
return theme;
}
function ConfigComponent({ config }) {
const theme = useTheme(config);
return (
The current theme is {theme}
)
}
export default ConfigComponent;
Geleerde Les: Gebruik `useCallback` om functies te memoïseren die als afhankelijkheden worden gebruikt. Gebruik `useRef` om stabiele referenties te maken naar waarden die u in effecten moet openen zonder dat de effecten opnieuw worden uitgevoerd. Overweeg bij het omgaan met complexe objecten of arrays om aangepaste comparators of abstractielagen te maken om effecten alleen te activeren wanneer relevante eigenschappen veranderen.
Globale Overwegingen
Bij het ontwikkelen van React-applicaties voor een wereldwijd publiek is het belangrijk om te overwegen hoe afhankelijkheden de lokalisatie en internationalisering kunnen beïnvloeden. Hier zijn enkele belangrijke overwegingen:
1. Locatie Wijzigingen
Als uw component afhankelijk is van de landinstelling van de gebruiker (bijv. voor het formatteren van datums, getallen of valuta's), moet u de landinstelling opnemen in de afhankelijkhedenarray. Dit zorgt ervoor dat het effect opnieuw wordt uitgevoerd wanneer de landinstelling verandert, waardoor de component wordt bijgewerkt met de juiste opmaak.
import React, { useState, useEffect } from 'react';
import { format } from 'date-fns'; // Vereist date-fns-bibliotheek (npm install date-fns)
function LocalizedDate({ date, locale }) {
const [formattedDate, setFormattedDate] = useState('');
useEffect(() => {
setFormattedDate(format(date, 'PPPP', { locale }));
}, [date, locale]); // Opnieuw uitvoeren wanneer `date` of `locale` verandert
return {formattedDate}
;
}
export default LocalizedDate;
In dit voorbeeld wordt de functie `format` van de `date-fns`-bibliotheek gebruikt om de datum te formatteren volgens de opgegeven landinstelling. De `locale` is opgenomen in de afhankelijkhedenarray, dus het effect wordt opnieuw uitgevoerd wanneer de landinstelling verandert, waardoor de opgemaakte datum wordt bijgewerkt.
2. Tijdzoneoverwegingen
Wees bij het werken met datums en tijden attent op tijdzones. Als uw component datums of tijden in de lokale tijdzone van de gebruiker weergeeft, moet u mogelijk de tijdzone opnemen in de afhankelijkhedenarray. Tijdzone wijzigingen komen echter minder vaak voor dan locatie wijzigingen, dus u kunt overwegen om een apart mechanisme te gebruiken voor het bijwerken van de tijdzone, zoals een globale context.
3. Valuta formatteren
Gebruik bij het formatteren van valuta's de juiste valutacode en landinstelling. Neem beide op in de afhankelijkhedenarray om ervoor te zorgen dat de valuta correct is opgemaakt voor de regio van de gebruiker.
import React, { useState, useEffect } from 'react';
function LocalizedCurrency({ amount, currency, locale }) {
const [formattedCurrency, setFormattedCurrency] = useState('');
useEffect(() => {
setFormattedCurrency(new Intl.NumberFormat(locale, { style: 'currency', currency }).format(amount));
}, [amount, currency, locale]); // Opnieuw uitvoeren wanneer `amount`, `currency` of `locale` verandert
return {formattedCurrency}
;
}
export default LocalizedCurrency;
Geleerde Les: Houd bij het ontwikkelen voor een wereldwijd publiek altijd rekening met de manier waarop afhankelijkheden lokalisatie en internationalisering kunnen beïnvloeden. Neem de locatie, tijdzone en valutacode indien nodig op in de afhankelijkhedenarray om ervoor te zorgen dat uw componenten gegevens correct weergeven voor gebruikers in verschillende regio's.
Conclusie
Het beheersen van `useEffect`-afhankelijkheden is cruciaal voor het schrijven van efficiënte, bugvrije en performante React aangepaste hooks. Door de veelvoorkomende valkuilen te begrijpen en de optimalisatietechnieken toe te passen die in deze handleiding worden besproken, kunt u aangepaste hooks maken die zowel herbruikbaar als onderhoudbaar zijn. Vergeet niet om zorgvuldig te overwegen welke afhankelijkheden echt nodig zijn, gebruik indien nodig memoïsatie en stabiele referenties, en wees attent op globale overwegingen zoals lokalisatie en internationalisering. Door deze best practices te volgen, kunt u het volledige potentieel van React aangepaste hooks benutten en hoogwaardige applicaties bouwen voor een wereldwijd publiek.
Deze uitgebreide gids heeft veel behandeld. Om samen te vatten, hier zijn de belangrijkste punten:
- Begrijp het doel van afhankelijkheden: Ze bepalen wanneer uw effect wordt uitgevoerd.
- Vermijd ontbrekende afhankelijkheden: Zorg ervoor dat alle variabelen die in het effect worden gebruikt, zijn opgenomen.
- Elimineer onnodige afhankelijkheden: Gebruik memoïsatie, destructurering of diepe vergelijking.
- Voorkom oneindige loops: Wees voorzichtig bij het bijwerken van statusvariabelen die ook afhankelijkheden zijn.
- Behandel de status als onveranderlijk: Maak nieuwe objecten of arrays bij het bijwerken.
- Memoïseer functies met `useCallback`: Voorkom onnodige re-renders.
- Gebruik `useRef` voor stabiele referenties: Krijg toegang tot de nieuwste waarde zonder re-renders te activeren.
- Overweeg globale implicaties: Houd rekening met locatie-, tijdzone- en valuta wijzigingen.
Door deze principes toe te passen, kunt u robuustere en efficiëntere React aangepaste hooks schrijven die de prestaties en onderhoudbaarheid van uw applicaties zullen verbeteren.