Crochet de useMemo
réaction
Le React useMemo
Hook renvoie une valeur mémorisée.
Considérez la mémorisation comme la mise en cache d'une valeur afin qu'elle n'ait pas besoin d'être recalculée.
Le useMemo
crochet ne s'exécute que lorsque l'une de ses dépendances est mise à jour.
Cela peut améliorer les performances.
Les crochets useMemo
et useCallback
sont similaires. La principale différence est que useMemo
renvoie une valeur mémorisée et
useCallback
renvoie une fonction mémorisée. Vous pouvez en savoir plus useCallback
dans le chapitre useCallback .
Performance
Le useMemo
crochet peut être utilisé pour empêcher les fonctions coûteuses et gourmandes en ressources de s'exécuter inutilement.
Dans cet exemple, nous avons une fonction coûteuse qui s'exécute sur chaque rendu.
Lors de la modification du nombre ou de l'ajout d'une tâche, vous remarquerez un retard d'exécution.
Exemple:
Une fonction peu performante. La expensiveCalculation
fonction s'exécute sur chaque rendu :
import { useState } from "react";
import ReactDOM from "react-dom";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const calculation = expensiveCalculation(count);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</div>
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
<h2>Expensive Calculation</h2>
{calculation}
</div>
</div>
);
};
const expensiveCalculation = (num) => {
console.log("Calculating...");
for (let i = 0; i < 1000000000; i++) {
num += 1;
}
return num;
};
ReactDOM.render(<App />, document.getElementById('root'));
Obtenir une certification!
95 $ S'INSCRIRE
UtiliseruseMemo
Pour résoudre ce problème de performances, nous pouvons utiliser le useMemo
crochet pour mémoriser la expensiveCalculation
fonction. Cela entraînera l'exécution de la fonction uniquement en cas de besoin.
Nous pouvons envelopper l'appel de fonction coûteux avec useMemo
.
Le useMemo
Hook accepte un second paramètre pour déclarer les dépendances. La fonction coûteuse ne s'exécutera que lorsque ses dépendances auront changé.
Dans l'exemple suivant, la fonction coûteuse ne s'exécutera que lorsqu'elle count
est modifiée et non lorsque des tâches sont ajoutées.
Exemple:
Exemple de performance utilisant le useMemo
Hook :
import { useState, useMemo } from "react";
import ReactDOM from "react-dom";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const calculation = useMemo(() => expensiveCalculation(count), [count]);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</div>
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
<h2>Expensive Calculation</h2>
{calculation}
</div>
</div>
);
};
const expensiveCalculation = (num) => {
console.log("Calculating...");
for (let i = 0; i < 1000000000; i++) {
num += 1;
}
return num;
};
ReactDOM.render(<App />, document.getElementById('root'));