Gancho de useMemo
reação
O React useMemo
Hook retorna um valor memorizado.
Pense na memoização como o armazenamento em cache de um valor para que ele não precise ser recalculado.
O useMemo
Hook só é executado quando uma de suas dependências é atualizada.
Isso pode melhorar o desempenho.
Os ganchos useMemo
e são semelhantes. useCallback
A principal diferença é que useMemo
retorna um valor memorizado e
useCallback
retorna uma função memorizada. Você pode aprender mais sobre useCallback
no capítulo useCallback .
Desempenho
O useMemo
Hook pode ser usado para impedir que funções caras e intensivas em recursos sejam executadas desnecessariamente.
Neste exemplo, temos uma função cara que é executada em cada renderização.
Ao alterar a contagem ou adicionar um todo, você notará um atraso na execução.
Exemplo:
Uma função de baixo desempenho. A expensiveCalculation
função é executada em cada renderização:
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'));
Obter certificação!
$ 95 INSCRIÇÃO
UsaruseMemo
Para corrigir esse problema de desempenho, podemos usar o useMemo
Hook para memorizar a expensiveCalculation
função. Isso fará com que a função seja executada apenas quando necessário.
Podemos envolver a chamada de função cara com useMemo
.
O useMemo
Hook aceita um segundo parâmetro para declarar dependências. A função cara só será executada quando suas dependências forem alteradas.
No exemplo a seguir, a função cara só será executada quando count
for alterada e não quando as tarefas forem adicionadas.
Exemplo:
Exemplo de desempenho usando o 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'));