useRef trả về một object { current } ổn định qua mọi lần render (cùng một tham chiếu). Sửa ref.current không kích hoạt re-render. Hai công dụng chính:
1. Tham chiếu tới DOM node: gắn ref={myRef} vào JSX rồi thao tác trực tiếp — inputRef.current.focus(), đo getBoundingClientRect(), điều khiển <video>, cuộn.
2. Lưu giá trị mutable qua các render mà không cần hiển thị: id của setInterval/setTimeout, giá trị "trước đó" (previous value), cờ nội bộ (đã mount chưa), một instance thư viện ngoài.
Khác useState:
useRef | useState | |
|---|---|---|
| Đổi giá trị → re-render | Không | Có |
| Đọc giá trị mới | Đồng bộ ngay (ref.current) | Sau lần render kế tiếp |
| Dùng cho | Dữ liệu không ảnh hưởng UI | Dữ liệu hiển thị trên UI |
Nguyên tắc: nếu thay đổi giá trị cần vẽ lại UI → useState; nếu chỉ cần nhớ giữa các render mà không hiển thị → useRef. Không đọc/ghi ref.current trong lúc render (chỉ trong event handler hoặc useEffect) để giữ render thuần khiết.