Giới Thiệu
Hiệu suất là một trong những yếu tố quan trọng nhất trong việc xây dựng ứng dụng web hiện đại. Trong React, một trong những nguyên nhân chính dẫn đến hiệu suất kém chính là re-render không cần thiết, có thể làm chậm ứng dụng, tăng mức sử dụng bộ nhớ và ảnh hưởng đến trải nghiệm người dùng.
Tin tốt là gì? Với một số kỹ thuật thông minh, bạn có thể tối ưu hiệu suất React và làm cho ứng dụng của bạn chạy mượt mà hơn.
Trong bài viết này, chúng ta sẽ cùng khám phá 7 mẹo thực tiễn để ngăn chặn việc re-render không cần thiết trong React.
Tại Sao Hiệu Suất Quan Trọng Trong React
- Thời gian tải nhanh cải thiện trải nghiệm người dùng
- Ứng dụng tối ưu giảm sử dụng bộ nhớ
- Hiệu suất tốt hơn đồng nghĩa với xếp hạng SEO cao hơn
- Tương tác mượt mà = người dùng hạnh phúc hơn
Re-render không cần thiết là một trong những nguyên nhân phổ biến nhất dẫn đến hiệu suất kém. Hãy khắc phục điều đó.
1️⃣ Sử Dụng React.memo Cho Các Thành Phần Hàm Tinh Khiết
Nếu thành phần của bạn luôn render ra cùng một output với cùng một props, bạn có thể bọc nó bằng React.memo.
javascript
import React from "react";
const Button = ({ onClick, label }) => {
console.log("Rendered:", label);
return <button onClick={onClick}>{label}</button>;
};
export default React.memo(Button);
✅ Tuyệt vời cho các thành phần hàm tinh khiết thường nhận cùng một props.
⚠️ Tránh lạm dụng, vì việc memo hóa không cần thiết có thể gây thêm overhead.
2️⃣ Tối Ưu Props Với useCallback & useMemo
Các hàm và đối tượng trong JavaScript là các kiểu tham chiếu. Việc truyền các tham chiếu mới làm props sẽ gây ra re-render.
- useCallback → Memoize các hàm
- useMemo → Memoize các giá trị
javascript
import React, { useState, useCallback, useMemo } from "react";
function App() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
setCount(c => c + 1);
}, []);
const expensiveValue = useMemo(() => {
return count * 2;
}, [count]);
return (
<div>
<button onClick={handleClick}>Tăng</button>
<p>Giá Trị Tính Toán: {expensiveValue}</p>
</div>
);
}
✅ Sử dụng useCallback cho các trình xử lý sự kiện
✅ Sử dụng useMemo cho các phép tính tốn kém
✅ Ngăn ngừa re-render không cần thiết ở các thành phần con.
✅ Tuyệt vời cho các phép tính nặng về hiệu suất.
3️⃣ Chia Nhỏ Mã Với React.lazy & Suspense
Các bundle lớn làm tăng thời gian tải ban đầu. Chia nhỏ mã với React.lazy giúp tải các thành phần chỉ khi cần thiết.
javascript
import React, { Suspense, lazy } from "react";
const Dashboard = lazy(() => import("./Dashboard"));
function App() {
return (
<Suspense fallback={<p>Đang tải...</p>}>
<Dashboard />
</Suspense>
);
}
✅ Cải thiện tốc độ tải trang ban đầu
✅ Người dùng chỉ tải những gì họ cần
✅ Cải thiện Core Web Vitals cho SEO.
4️⃣ Ảo Hóa Danh Sách Dài Với react-window / react-virtualized
Việc render hàng ngàn phần tử DOM cùng một lúc là rất tốn kém. Sử dụng ảo hóa danh sách để chỉ render những gì đang hiển thị.
javascript
import { FixedSizeList as List } from "react-window";
const Row = ({ index, style }) => (
<div style={style}>Hàng {index}</div>
);
function App() {
return (
<List height={400} itemCount={1000} itemSize={35} width={300}>
{Row}
</List>
);
}
✅ Xử lý hiệu quả các tập dữ liệu lớn
✅ Giảm mức sử dụng bộ nhớ và re-render.
5️⃣ Tránh Các Hàm Vô Danh Trong JSX
Định nghĩa các hàm bên trong JSX gây ra một thể hiện hàm mới trên mỗi lần render, điều này có thể kích hoạt re-render.
❌ Thực Hành Xấu:
javascript
<button onClick={() => setCount(count + 1)}>Click</button>
✅ Thực Hành Tốt:
javascript
const handleClick = () => setCount(count + 1);
<button onClick={handleClick}>Click</button>
✅ Tránh các tham chiếu mới trên mỗi lần render.
✅ Hoạt động tốt với React.memo.
6️⃣ Thực Hành Tốt Sử Dụng Keys Trong Danh Sách
Việc sử dụng props key không chính xác có thể khiến React re-render không cần thiết.
✅ Luôn sử dụng các key duy nhất và ổn định:
javascript
{users.map(user => (
<UserCard key={user.id} user={user} />
))}
❌ Tránh sử dụng chỉ số mảng làm key (trừ khi là danh sách tĩnh).
7️⃣ Phân Tích Hiệu Suất Với React DevTools
Trước khi tối ưu hóa một cách mù quáng, hãy sử dụng React DevTools Profiler để đo hiệu suất.
Các bước:
- Cài đặt tiện ích mở rộng React DevTools
- Chuyển đến tab Profiler
- Ghi lại các tương tác để xem các thành phần nào re-render không cần thiết
✅ Giúp bạn tập trung vào các nút thắt thực sự.
🎯 Kết Luận
Tối ưu hóa hiệu suất React không có nghĩa là thêm phức tạp một cách sớm. Thay vào đó, hãy tập trung vào việc ngăn ngừa re-render không cần thiết và chỉ tải những gì cần thiết.
✅ Tóm tắt nhanh 7 mẹo:
- Sử dụng React.memo
- Tối ưu hóa với useCallback & useMemo
- Chia nhỏ mã với React.lazy & Suspense
- Ảo hóa danh sách dài
- Tránh hàm vô danh trong JSX
- Sử dụng keys đúng cách trong danh sách
- Phân tích với React DevTools
👉 Hãy nhớ: Luôn phân tích trước khi tối ưu hóa—đừng sửa chữa những gì chưa bị hỏng.
Với những kỹ thuật này, ứng dụng React của bạn sẽ cảm giác nhanh hơn, mượt mà hơn và chuyên nghiệp hơn. 🚀