Class 10: UseRef và thao tác với DOM
useRef là gì?
useRef là một hook trong React được dùng để tạo ra một tham chiếu (reference) có thể lưu giữ giá trị hoặc tham chiếu đến một phần tử DOM mà không gây re-render khi giá trị thay đổi.
Cú pháp:
const myRef = useRef<GiáTrịHoặcKiểuPhầnTử>(giáTrịBanĐầu);Nếu bạn truyền vào
useRef(null), nó sẽ trả về một object có dạng{ current: null }.Khi bạn gán
ref={myRef}vào một phần tử JSX,myRef.currentsẽ trỏ tới phần tử DOM đó sau khi render.
Lưu giá trị không làm re-render
Một điểm quan trọng của useRef là thay đổi giá trị current sẽ không làm component bị re-render (khác với useState).
Ví dụ:
'use client';
import { useRef, useState } from 'react';
export default function RefCounter() {
const [count, setCount] = useState(0);
const renderCount = useRef(0);
renderCount.current += 1;
return (
<div>
<p>Giá trị count: {count}</p>
<p>Số lần render: {renderCount.current}</p>
<button onClick={() => setCount(prev => prev + 1)}>Tăng</button>
</div>
);
}Giải thích:
renderCountđược tăng mỗi lần component render lại.Vì
renderCount.currentkhông được quản lý bởiuseState, việc thay đổi giá trị không gây render lại component.
Truy cập DOM trực tiếp bằng ref
Bạn có thể dùng useRef để lấy phần tử DOM thật (giống như document.querySelector).
Ví dụ: tự động focus vào một ô input sau khi component được mount:
Cuộn đến phần tử
Bạn cũng có thể dùng useRef để cuộn đến một phần tử bất kỳ trên trang.
Bài tập thực hành
Mục tiêu
Áp dụng useRef để:
Focus tự động vào input khi component được render.
Đếm số lần render mà không làm component re-render.
Cuộn mượt đến một phần tử cụ thể khi nhấn nút.
Đề bài
Tạo một component tên là RefPractice với các chức năng:
Có một ô input và khi trang load sẽ tự động focus vào ô đó.
Có một nút "Tăng" để tăng một biến count sử dụng
useState.Hiển thị số lần render bằng
useRef.Có một khối nội dung nằm phía dưới và một nút "Cuộn xuống" để cuộn đến khối đó.
Gợi ý code mẫu
Kết luận
useReflà công cụ cực kỳ mạnh trong React để giữ lại giá trị hoặc thao tác trực tiếp với DOM mà không gây re-render.Thường dùng
useRefđể:Focus input.
Scroll đến phần tử.
Đếm render hoặc lưu giá trị cũ.
Last updated