React useMemo Hook - Các thông tin cơ bản
25/07/2023 01:19
Hook useMemochỉ chạy khi một trong các phần phụ thuộc của nó cập nhật. Cùng tìm hiểu thêm về React useMemo Hook ngay trong bài viết sau
React useMemo
Hook trả về một giá trị được ghi nhớ.
Hãy coi quá trình ghi nhớ giống như lưu vào bộ nhớ đệm một giá trị để không cần phải tính toán lại.
Hook useMemo
chỉ chạy khi một trong các phần phụ thuộc của nó cập nhật.
Điều này có thể cải thiện hiệu suất.
Các useMemo
và useCallback
Móc tương tự nhau. Sự khác biệt chính là useMemo
trả về một giá trị được ghi nhớ và useCallback
trả về một hàm được ghi nhớ. Bạn có thể tìm hiểu thêm useCallback
trong chương useCallback .
Hiệu suất
Hook useMemo
có thể được sử dụng để giữ cho các chức năng sử dụng nhiều tài nguyên, đắt tiền không chạy một cách không cần thiết.
Trong ví dụ này, chúng ta có một hàm đắt tiền chạy trên mọi kết xuất.
Khi thay đổi số lượng hoặc thêm một việc cần làm, bạn sẽ nhận thấy sự chậm trễ trong quá trình thực thi.
Ví dụ:
Một chức năng hoạt động kém. Hàm expensiveCalculation
chạy trên mọi kết xuất:
import { useState } from "react";
import ReactDOM from "react-dom/client";
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;
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
Sử dụnguseMemo
Để khắc phục sự cố hiệu suất này, chúng ta có thể sử dụng useMemo
Hook để ghi nhớ expensiveCalculation
chức năng. Điều này sẽ khiến chức năng chỉ chạy khi cần thiết.
Chúng ta có thể kết thúc lệnh gọi hàm đắt tiền bằng useMemo
.
Hook useMemo
chấp nhận tham số thứ hai để khai báo các phụ thuộc. Chức năng đắt tiền sẽ chỉ chạy khi các phụ thuộc của nó đã thay đổi.
Trong ví dụ sau, chức năng đắt tiền sẽ chỉ chạy khi count
được thay đổi chứ không phải khi việc cần làm được thêm vào.
Ví dụ:
Ví dụ về hiệu suất sử dụng useMemo
Hook:
import { useState, useMemo } from "react";
import ReactDOM from "react-dom/client";
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;
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);