useMemo 是 React 中用來記憶化計算結果的一個 Hook。能夠在每次重新渲染的時候緩存計算的結果,只有當某些依賴項發生變化時才會重新計算,這在處理昂貴的計算上帶來更好的性能優化。
const cachedValue = useMemo(calculateValue, dependencies)
//範例
const cachedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
當依賴項沒有發生變化時,useMemo 將返回上一次的計算結果,從而避免重新計算。
以下是一個應用範例,展示了如何使用 useMemo 來優化性能。在這個範例中,我們有一個 Todo 列表與一個計數器,並進行了一個昂貴的計算。透過 useMemo,我們將只在必要時重新計算,而不會每次渲染都執行計算邏輯。
import { useState, useMemo } from 'react';
const App = () => {
// 定義兩個狀態:count 和 todos
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
// 使用 useMemo 記憶化昂貴的計算,當 count 改變時才會重新計算
const calculation = useMemo(() => expensiveCalculation(count), [count]);
// 增加 count 的函數
const increment = () => {
setCount(c => c + 1);
};
// 新增 todo 項目的函數
const addTodo = () => {
setTodos(t => [...t, 'New Todo']);
};
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => (
<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;
};
export default App;
useState 狀態管理:
useState 來管理兩個狀態:
count:用來儲存計數器的值。todos:用來存放 Todo 列表的內容。useMemo 的應用:
useMemo 用來緩存「昂貴的計算結果」,當依賴的 count 狀態改變時,才會重新計算。如果 count 沒有變化,React 會直接使用先前緩存的結果,避免不必要的重複計算。Add Todo」按鈕來新增一個新項目到 Todo 列表。+」按鈕來增加計數,當計數器變化時,會觸發昂貴的計算。
只有按下「+」按鈕,才會觸發重新計算
useMemo 的好處expensiveCalculation 是一個模擬的耗時計算。如果我們沒有使用 useMemo,每次 todos 改變時,React 都會重新執行這個計算,造成不必要的資源浪費。通過 useMemo,我們只會在 count 變化時重新執行計算,從而提升性能。todos 變化不會影響 count 的計算,但如果沒有使用 useMemo,每次重新渲染都會重新計算 expensiveCalculation。useMemo 能夠有效地防止這種不必要的重新計算。useMemo 的使用注意事項useMemo 的主要用途是優化昂貴的計算過程。如果你的計算或渲染過程非常簡單,那麼使用 useMemo 可能反而增加了不必要的複雜度。useMemo 的依賴項時,要確保列出所有在計算過程中使用到的狀態或 props。如果漏掉了某些依賴項,可能會導致計算結果不更新,造成應用邏輯錯誤。useMemo 可以幫助你在 React 應用中記憶化計算結果,從而提升性能。尤其是在處理昂貴的計算或需要避免不必要的重複渲染時,useMemo 能夠有效地避免重複的計算。
本文將會同步更新到我的部落格