🚀 10 Nguyên Tắc Cốt Lõi Giúp Bạn Thành Thạo React

February 10, 2025 (1mo ago)

React không chỉ là một thư viện UI mà còn là một hệ sinh thái rộng lớn với nhiều khái niệm quan trọng. Nếu bạn muốn trở thành một lập trình viên React giỏi, đừng chỉ dừng lại ở việc "biết dùng". Hãy hiểu sâu bản chất và tư duy đúng đắn khi làm việc với React.


1️⃣ Hiểu Rõ React Rendering - Tránh Re-render Không Cần Thiết

Một trong những vấn đề lớn nhất khi làm việc với React là quá nhiều re-render không cần thiết, làm giảm hiệu suất ứng dụng.

🔹 Khi một component re-render?

🔹 Cách tối ưu:

Sử dụng React.memo cho component
Sử dụng useCallbackuseMemo để tránh tạo lại hàm hoặc object không cần thiết
Tối ưu context bằng cách chia nhỏ provider

const Button = React.memo(({ onClick }: { onClick: () => void }) => {
  console.log("Button re-render");
  return <button onClick={onClick}>Click me</button>;
});
 
export default function App() {
  const handleClick = useCallback(() => {
    console.log("Clicked!");
  }, []);
 
  return <Button onClick={handleClick} />;
}

2️⃣ Quản Lý State Đúng Cách

State trong React có thể chia thành:

🔹 Quy tắc quan trọng:

Giữ state ở nơi thấp nhất có thể
Tránh prop drilling bằng Context hoặc state management library
Tránh lưu dữ liệu có thể tính toán được trong state

const [price, setPrice] = useState(100);
const [quantity, setQuantity] = useState(2);
 
// ❌ Không cần lưu total vào state, vì nó có thể tính toán
const total = price * quantity;

👉 Tránh lưu total vào state vì nó có thể tính từ pricequantity.


3️⃣ Hiểu Rõ useEffect Và Cách Tối Ưu

useEffect là hook mạnh mẽ nhưng dễ bị lạm dụng, gây memory leak hoặc hiệu suất kém.

🔹 Cách sử dụng useEffect đúng đắn:

Chỉ dùng khi cần side effect (gọi API, thao tác DOM...)
Luôn dọn dẹp với return function nếu cần
Tránh chạy lại useEffect không cần thiết bằng dependency array

useEffect(() => {
  console.log("Component re-render!");
}, []);

👉 Nên dùng dependency array hợp lý để tránh gọi lại không cần thiết.


4️⃣ Sử Dụng React Query Để Quản Lý Dữ Liệu Bất Đồng Bộ

React Query giúp quản lý dữ liệu bất đồng bộ dễ dàng hơn so với useEffect + useState.

Tự động caching và refetching
Giảm số lần gọi API không cần thiết
Xử lý trạng thái loading, error đơn giản hơn

import { useQuery } from "react-query";
 
const { data, isLoading, error } = useQuery("posts", fetchPosts);

5️⃣ Tối Ưu Performance Với Code Splitting

Code splitting giúp giảm kích thước bundle bằng cách tải component theo nhu cầu.

Dùng React.lazy & Suspense để load component khi cần

const LazyComponent = React.lazy(() => import("./LazyComponent"));
 
<Suspense fallback={<div>Loading...</div>}>
  <LazyComponent />
</Suspense>

6️⃣ Sử Dụng Server Components Để Tối Ưu Hiệu Suất

Server Components giúp giảm tải cho client, tăng tốc render.

Dùng Next.js với Server Components
Tránh fetch dữ liệu trên client khi có thể fetch trên server


7️⃣ Sử Dụng Suspense Để Cải Thiện UX

Suspense giúp hiển thị UI loading tốt hơn trong quá trình fetch data.


8️⃣ Bắt Lỗi Và Debug Hiệu Quả

Dùng React DevTools, Error Boundaries để debug nhanh hơn.


9️⃣ Tối Ưu Giao Diện Với Framer Motion

Framer Motion giúp tạo animation mượt mà, dễ dàng hơn CSS.


🔟 Áp Dụng Best Practices Trong React

Viết code clean, có tổ chức, sử dụng TypeScript và kiểm thử component với Jest.


🎯 Tóm Lại

Tránh re-render không cần thiết (dùng React.memo, useCallback, useMemo).
Quản lý state đúng cách (tránh prop drilling, không lưu state thừa).
Hiểu rõ useEffect, tránh chạy lại vô ích.
Dùng React Query hoặc Server Components để xử lý API tốt hơn.
Dùng Suspense, useTransition để cải thiện UX.

📌 Càng hiểu rõ React, code của bạn càng tối ưu và dễ bảo trì! 🚀