
Tối ưu hóa quản lý State cho Modal và Drawer trong React với useDisclosure Hook
Khám phá cách sử dụng useDisclosure hook để đơn giản hóa việc quản lý trạng thái đóng mở cho các thành phần UI như Modal, Drawer hay Popover trong dự án React, giúp code sạch hơn và dễ bảo trì hơn.
Bài viết được dịch và tổng hợp từ tin tức gốc. Bạn có thể đọc bài viết gốc bằng tiếng Anh tại đây.
Điểm tin nhanh:
- useDisclosure là một custom hook giúp trừu tượng hóa logic đóng mở (toggle) cho các thành phần giao diện.
- Thay vì viết thủ công nhiều state và hàm handler, hook này cung cấp sẵn các phương thức như isOpen, onOpen, onClose, và onToggle.
- Giải pháp này giúp giảm thiểu boilerplate code, tăng tính tái sử dụng và khả năng đọc hiểu trong các dự án React hiện đại.
Trong quá trình phát triển các ứng dụng web phức tạp, việc quản lý trạng thái đóng mở (visibility state) cho các thành phần như Modal, Drawer hay Tooltip thường trở thành một gánh nặng lặp đi lặp lại. Nếu bạn đang cảm thấy mệt mỏi với việc khai báo hàng loạt useState và các hàm xử lý thủ công cho từng thành phần, đã đến lúc tối ưu hóa quy trình này. Việc nắm vững các kỹ thuật quản lý trạng thái không chỉ giúp code gọn gàng mà còn là nền tảng để xây dựng các kiến trúc phần mềm vững chắc.
Tại sao cần useDisclosure Hook?
Thông thường, để hiển thị một Modal, bạn sẽ cần ít nhất một biến state và các hàm để thay đổi nó. Khi số lượng thành phần tăng lên, code của bạn sẽ nhanh chóng trở nên cồng kềnh. useDisclosure ra đời như một giải pháp tiêu chuẩn hóa logic này.

Cấu trúc cơ bản của Hook
Thay vì viết lại logic, bạn có thể triển khai một custom hook đơn giản như sau:
import { useState, useCallback } from 'react';
export const useDisclosure = (initialState = false) => {
const [isOpen, setIsOpen] = useState(initialState);
const onOpen = useCallback(() => setIsOpen(true), []);
const onClose = useCallback(() => setIsOpen(false), []);
const onToggle = useCallback(() => setIsOpen((prev) => !prev), []);
return { isOpen, onOpen, onClose, onToggle };
};
Việc áp dụng các hook tùy chỉnh như thế này cũng tương tự như cách chúng ta tối ưu hóa quy trình lập trình với các Task Runners, giúp giảm thiểu sai sót và tăng tốc độ phát triển.
So sánh cách tiếp cận
Để thấy rõ sự khác biệt, hãy nhìn vào bảng so sánh dưới đây giữa cách làm truyền thống và sử dụng hook:
| Đặc điểm | Cách truyền thống (useState) | Sử dụng useDisclosure Hook |
|---|---|---|
| Số lượng dòng code | Nhiều (lặp lại cho mỗi modal) | Rất ít (tái sử dụng cao) |
| Khả năng bảo trì | Thấp, dễ gây nhầm lẫn | Cao, logic tập trung |
| Tính nhất quán | Phụ thuộc vào người viết | Đồng nhất toàn dự án |
Mẹo hay: Bạn nên kết hợp hook này với các thư viện UI như Chakra UI hoặc Mantine, vì chúng đã tích hợp sẵn
useDisclosurecực kỳ mạnh mẽ và tối ưu.
Ứng dụng trong thực tế
Khi làm việc với các giao diện phức tạp, việc kiểm soát đầu ra của các thành phần là cực kỳ quan trọng. Bạn có thể tham khảo thêm về cách kiểm soát đầu ra AI với JSON để áp dụng tư duy cấu trúc dữ liệu tương tự vào quản lý UI.
Sơ đồ luồng hoạt động của hook:
[Trạng thái ban đầu] ---> [onOpen/onToggle] ---> [isOpen = true] ---> [Hiển thị Modal]
[isOpen = true] ---> [onClose] ---> [Trạng thái ban đầu]
Đánh giá & Lời khuyên Thực tiễn
Từ góc độ của một Senior Tech Lead, tôi đánh giá useDisclosure là một công cụ không thể thiếu trong bộ công cụ của Frontend Developer.
- Ưu điểm: Giảm boilerplate code, tăng tính nhất quán, dễ dàng unit test logic đóng mở.
- Nhược điểm: Nếu lạm dụng cho các state phức tạp hơn (ví dụ: cần truyền thêm data vào modal), bạn có thể cần chuyển sang
useReducerhoặc các thư viện state management chuyên sâu hơn. - Lưu ý: Khi triển khai trên môi trường Production, hãy đảm bảo rằng các hàm
onOpen,onCloseđược bao bọc bởiuseCallbackđể tránh việc re-render không cần thiết của các component con.
Câu hỏi thường gặp (FAQ)
useDisclosure có thay thế được Redux không?
Không, hook này chỉ dùng để quản lý trạng thái cục bộ (local state) của UI, không thay thế được các giải pháp quản lý state toàn cục cho dữ liệu ứng dụng.
Có nên dùng useDisclosure cho mọi thành phần không?
Chỉ nên dùng cho các thành phần có logic đóng/mở đơn giản. Với các thành phần yêu cầu logic phức tạp, hãy cân nhắc các giải pháp khác.
Hook này có hỗ trợ TypeScript không?
Hoàn toàn có. Bạn có thể dễ dàng định nghĩa kiểu dữ liệu cho hook để tăng độ an toàn cho code.
Kết luận
Việc sử dụng useDisclosure là một bước tiến nhỏ nhưng mang lại hiệu quả lớn trong việc làm sạch codebase React. Bằng cách tập trung logic vào một nơi, bạn sẽ có nhiều thời gian hơn để tập trung vào các tính năng quan trọng khác. Hãy bắt đầu refactor code của bạn ngay hôm nay và đừng quên theo dõi hi_dev để cập nhật thêm những kỹ thuật tối ưu hóa hiệu năng mới nhất.
Do you like this post?
Upvote to push this post higher on the community feed




