Series 4 – React Hooks – State
Bài 1 : Hooks, useState và useEffect – Quản lý dữ liệu và side effects trong React
1. React Hooks là gì?
Hooks là những hàm do React cung cấp để Function Component sử dụng các khả năng như quản lý state, đồng bộ với hệ thống bên ngoài và chia sẻ logic giữa các component.
Ba khái niệm cần hiểu đầu tiên là Hooks, useState và useEffect.
2. Hooks
Một số Hook phổ biến:
| Hook | Công dụng |
|---|---|
useState |
Quản lý state |
useEffect |
Đồng bộ component với hệ thống bên ngoài |
useRef |
Lưu giá trị không cần kích hoạt render |
useContext |
Đọc dữ liệu từ Context |
useMemo |
Ghi nhớ kết quả tính toán khi phù hợp |
useCallback |
Ghi nhớ hàm khi phù hợp |
Quy tắc sử dụng Hooks
- Gọi Hooks ở cấp cao nhất của Function Component hoặc custom Hook.
- Không gọi Hooks bên trong vòng lặp, điều kiện hoặc hàm lồng nhau.
- Không gọi Hooks trực tiếp từ một hàm thông thường nằm ngoài component hay custom Hook.
Ví dụ đúng:
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}
Việc tuân thủ quy tắc này giúp React giữ đúng thứ tự các Hook giữa những lần render.
3. useState
useState cho phép component lưu dữ liệu thay đổi theo thời gian.
import { useState } from "react";
function Toggle() {
const [isOpen, setIsOpen] = useState(false);
return (
<button onClick={() => setIsOpen((previous) => !previous)}>
{isOpen ? "Đang mở" : "Đang đóng"}
</button>
);
}
Khi gọi hàm cập nhật state, React lên lịch render lại component với state mới.
State có thể là số, chuỗi, Boolean, mảng hoặc object. Khi cập nhật mảng hay object, nên tạo giá trị mới thay vì sửa trực tiếp dữ liệu hiện tại.
4. useEffect
useEffect được sử dụng để đồng bộ component với hệ thống bên ngoài, chẳng hạn:
- Đăng ký hoặc hủy đăng ký sự kiện.
- Kết nối đến một dịch vụ bên ngoài.
- Đồng bộ với một API hoặc thư viện không thuộc React.
- Quản lý một số side effects theo vòng đời component.
Ví dụ đăng ký sự kiện online:
import { useEffect, useState } from "react";
function NetworkStatus() {
const [isOnline, setIsOnline] = useState(
typeof navigator !== "undefined"
? navigator.onLine
: true
);
useEffect(() => {
function handleOnline() {
setIsOnline(true);
}
function handleOffline() {
setIsOnline(false);
}
window.addEventListener("online", handleOnline);
window.addEventListener("offline", handleOffline);
return () => {
window.removeEventListener("online", handleOnline);
window.removeEventListener("offline", handleOffline);
};
}, []);
return <p>{isOnline ? "Đang trực tuyến" : "Mất kết nối"}</p>;
}
Trong ví dụ:
- Effect đăng ký hai sự kiện khi được thiết lập.
- Hàm cleanup gỡ các sự kiện khi Effect cần được dọn dẹp.
- Mảng dependency rỗng thể hiện Effect không phụ thuộc vào giá trị reactive nào từ component. Trong môi trường phát triển với Strict Mode, React có thể chạy thêm một chu kỳ thiết lập và dọn dẹp để giúp phát hiện lỗi.
Dependency array hoạt động như thế nào?
useEffect(() => {
// Logic đồng bộ
}, [value]);
Effect sẽ được thiết lập lại khi dependency thay đổi.
- Không truyền dependency array: Effect chạy sau mỗi lần component commit.
- Truyền
[]: Effect không phụ thuộc vào các giá trị reactive từ component. - Truyền
[value]: Effect đồng bộ lại khivaluethay đổi.
Không nên dùng useEffect cho mọi phép tính. Nếu chỉ cần tính một giá trị từ props hoặc state, hãy tính trực tiếp trong lúc render khi phép tính đủ đơn giản.
5. So sánh useState và useEffect
| Tiêu chí | useState |
useEffect |
|---|---|---|
| Mục đích | Lưu dữ liệu | Đồng bộ với hệ thống bên ngoài |
| Khi dùng | Dữ liệu ảnh hưởng giao diện | Side effects cần đồng bộ |
| Ví dụ | Bộ đếm, trạng thái modal | Event listener, kết nối bên ngoài |
6. Bài tập thực hành
Xây dựng component hiển thị bộ đếm thời gian:
- Sử dụng
useStateđể lưu số giây. - Sử dụng
useEffectđể thiết lập bộ đếm bằngsetInterval. - Tăng số giây mỗi giây.
- Dọn dẹp interval khi Effect kết thúc.
- Đảm bảo không tạo ra nhiều interval ngoài ý muốn.
7. Kết luận
Hooks giúp Function Component quản lý state và tương tác với hệ thống bên ngoài. useState phục vụ dữ liệu của giao diện, còn useEffect được dùng khi cần đồng bộ với những hệ thống nằm ngoài quá trình render của React.
Tiếp theo, chúng ta sẽ tìm hiểu useRef, Context API và State Lifting để xử lý việc lưu trữ và chia sẻ dữ liệu giữa nhiều component.





Khoá học lập trình game con rắn cho trẻ em




