Ce sont deux hooks d'optimisation dans React, mais ils servent des objectifs légèrement différents.
Décomposons-le :
1. Objectif :
2. Ce qu'ils retournent :
3. Cas d'utilisation :
4. Syntaxe :
const memoizedCallback = useCallback( () => { doSomething(a, b); }, [a, b], ); const memoizedValue = useMemo( () => computeExpensiveValue(a, b), [a, b] );
5. Implications sur les performances :
Regardons quelques exemples pour illustrer les différences :
Exemple d'utilisation de useCallback :
import React, { useState, useCallback } from 'react'; const ParentComponent = () => { const [count, setCount] = useState(0); const handleClick = useCallback(() => { setCount(count + 1); }, [count]); return ( <div> <ChildComponent onClick={handleClick} /> <p>Count: {count}</p> </div> ); }; const ChildComponent = React.memo(({ onClick }) => { console.log('ChildComponent rendered'); return <button onClick={onClick}>Increment</button>; });
Dans cet exemple, useCallback est utilisé pour mémoriser la fonction handleClick. Ceci est utile car ChildComponent est enveloppé dans React.memo, ce qui signifie qu'il ne sera restitué que si ses accessoires changent. En utilisant useCallback, nous garantissons que handleClick conserve la même référence entre les rendus (sauf si le nombre change), évitant ainsi les nouveaux rendus inutiles de ChildComponent.
Exemple d'utilisation de useMemo :
import React, { useState, useMemo } from 'react'; const ExpensiveComponent = ({ list }) => { const sortedList = useMemo(() => { console.log('Sorting list'); return [...list].sort((a, b) => a - b); }, [list]); return ( <div> <h2>Sorted List:</h2> {sortedList.map(item => <div key={item}>{item}</div>)} </div> ); }; const ParentComponent = () => { const [list] = useState([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]); const [count, setCount] = useState(0); return ( <div> <ExpensiveComponent list={list} /> <button onClick={() => setCount(count + 1)}> Clicked {count} times </button> </div> ); };
Dans cet exemple, useMemo est utilisé pour mémoriser la liste triée. L'opération de tri coûteuse ne sera effectuée que lorsque la prop de liste change, et non à chaque rendu de ExpensiveComponent. Ceci est particulièrement utile ici car ParentComponent peut effectuer un nouveau rendu pour des raisons sans rapport avec la liste (comme lorsque le nombre change), et nous ne voulons pas re-trier la liste inutilement.
Principaux points à retenir :
suivez pour plus de contenu comme celui-ci !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!