Ref trong Reactjs là gì? Cùng giải mã ngay thông tin về Ref trong Reactjs
05/07/2022 09:47
Refs trong ReactJs cung cấp một cách để truy cập các nút DOM hoặc các phần tử React được tạo trong phương thức kết xuất. Trong quy trình dữ liệu React điển hình, props là cách duy nhất mà các thành phần gốc tương tác với con của chúng. Để sửa đổi tệp children, bạn kết xuất lại nó bằng các props mới. Tuy nhiên, có một số trường hợp bạn cần phải sửa đổi cấp bậc một phần tử con bên ngoài luồng dữ liệu điển hình. Phần tử con cần sửa đổi có thể là một phiên bản của thành phần React hoặc nó có thể là một phần tử DOM. Đối với cả hai trường hợp này, React cung cấp một lối thoát, đó chính là Ref.
Khi nào sử dụng Refs trong ReactJS
Có một số trường hợp có thể sử dụng refs:
- Quản lý tiêu điểm, lựa chọn văn bản hoặc phát lại phương tiện.
- Kích hoạt các hoạt ảnh bắt buộc.
- Tích hợp với thư viện DOM của bên thứ ba.
Tránh sử dụng refs cho bất kỳ thứ gì có thể được thực hiện một cách khai báo.
Ví dụ, thay vì hiển thị open()
và close()
các phương thức trên một Dialog
thành phần, hãy chuyển một phương thức isOpen
hỗ trợ cho nó.
>>> Đọc thêm: State trong ReactJS
Đừng lạm dụng Refs trong ReactJS
Xu hướng đầu tiên của bạn có thể là sử dụng refs để “làm cho mọi thứ xảy ra” trong ứng dụng của bạn. Nếu đúng như vậy, hãy dành một chút thời gian và suy nghĩ chín chắn hơn về vị trí mà trạng thái nên được sở hữu trong hệ thống phân cấp thành phần. Thông thường, rõ ràng là nơi thích hợp để “sở hữu” trạng thái đó là ở cấp cao hơn trong hệ thống phân cấp. Xem hướng dẫn Lifting State Up để biết các ví dụ về điều này.
Tạo Refs
Refs được tạo bằng cách sử dụng React.createRef()
và gắn vào các phần tử React thông qua ref
thuộc tính. Các Refs thường được gán cho một thuộc tính instance khi một thành phần được xây dựng để chúng có thể được tham chiếu trong toàn bộ thành phần.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef(); }
render() {
return <div ref={this.myRef} />; }
}
Truy cập Refs trong ReactJS
Khi một render
tham chiếu được chuyển cho một phần tử trong , một tham chiếu đến nút sẽ có thể truy cập được tại current
thuộc tính của tham chiếu .
const node = this.myRef.current;
Giá trị của tham chiếu khác nhau tùy thuộc vào loại nút:
- Khi
ref
thuộc tính được sử dụng trên một phần tử HTML, thì phần tửref
được tạo trong phương thức khởi tạo vớiReact.createRef()
sẽ nhận phần tử DOM bên dưới làm thuộc tính của nócurrent
. - Khi
ref
thuộc tính được sử dụng trên một thành phần lớp tùy chỉnh,ref
đối tượng sẽ nhận thể hiện được gắn kết của thành phần đó làm thành phần của nócurrent
. - Bạn không thể sử dụng
ref
thuộc tính trên các thành phần hàm vì chúng không có phiên bản.
Các ví dụ dưới đây chứng minh sự khác biệt.
Thêm một tham chiếu vào một phần tử DOM
Mã này sử dụng một ref
để lưu trữ một tham chiếu đến một nút DOM:
class CustomTextInput extends React.Component {
constructor(props) {
super(props);
// create a ref to store the textInput DOM element
this.textInput = React.createRef(); this.focusTextInput = this.focusTextInput.bind(this);
}
focusTextInput() {
// Explicitly focus the text input using the raw DOM API
// Note: we're accessing "current" to get the DOM node
this.textInput.current.focus(); }
render() {
// tell React that we want to associate the <input> ref
// with the `textInput` that we created in the constructor
return (
<div>
<input
type="text"
ref={this.textInput} /> <input
type="button"
value="Focus the text input"
onClick={this.focusTextInput}
/>
</div>
);
}
}
React sẽ gán thuộc current
tính với phần tử DOM khi thành phần này gắn kết và gán lại cho null
nó khi nó ngắt kết nối. ref
cập nhật xảy ra trước componentDidMount
hoặc componentDidUpdate
các phương pháp vòng đời.
Thêm một tham chiếu vào một thành phần lớp
Nếu chúng tôi muốn kết thúc phần CustomTextInput
trên để mô phỏng nó được nhấp ngay sau khi gắn, chúng tôi có thể sử dụng một tham chiếu để truy cập vào đầu vào tùy chỉnh và gọi focusTextInput
phương thức của nó theo cách thủ công:
class AutoFocusTextInput extends React.Component {
constructor(props) {
super(props);
this.textInput = React.createRef(); }
componentDidMount() {
this.textInput.current.focusTextInput(); }
render() {
return (
<CustomTextInput ref={this.textInput} /> );
}
}
Lưu ý rằng điều này chỉ hoạt động nếu CustomTextInput
được khai báo là một lớp:
class CustomTextInput extends React.Component { // ...
}
Refs trong ReactJS và các thành phần chức năng
Theo mặc định, bạn không thể sử dụng ref
thuộc tính trên các thành phần hàm vì chúng không có các phiên bản:
function MyFunctionComponent() { return <input />; } class Parent extends React.Component { constructor(props) { super(props); this.textInput = React.createRef(); } render() { // This will *not* work! return ( <MyFunctionComponent ref={this.textInput} /> ); } }
Nếu bạn muốn cho phép mọi người sử dụng một ref
thành phần chức năng của mình, bạn có thể sử dụng forwardRef
(có thể kết hợp với useImperativeHandle
) hoặc bạn có thể chuyển đổi thành phần này thành một lớp.
Tuy nhiên, bạn có thể sử dụng ref
thuộc tính bên trong một thành phần hàm miễn là bạn tham chiếu đến phần tử DOM hoặc thành phần lớp:
function CustomTextInput(props) { // textInput must be declared here so the ref can refer to it const textInput = useRef(null); function handleClick() { textInput.current.focus(); } return ( <div> <input type="text" ref={textInput} /> <input type="button" value="Focus the text input" onClick={handleClick} /> </div> ); }
Hiển thị DOM Refs trong ReactJs cho các thành phần chính
Trong một số trường hợp hiếm hoi, bạn có thể muốn có quyền truy cập vào nút DOM của một đứa trẻ từ một thành phần chính. Điều này thường không được khuyến nghị vì nó phá vỡ tính đóng gói của thành phần, nhưng đôi khi nó có thể hữu ích để kích hoạt tiêu điểm hoặc đo kích thước hoặc vị trí của nút DOM con.
Mặc dù bạn có thể thêm một tham chiếu vào thành phần con , nhưng đây không phải là một giải pháp lý tưởng, vì bạn sẽ chỉ nhận được một cá thể thành phần chứ không phải là một nút DOM. Ngoài ra, điều này sẽ không hoạt động với các thành phần chức năng.
Nếu bạn sử dụng React 16.3 trở lên, chúng tôi khuyên bạn nên sử dụng chuyển tiếp ref cho những trường hợp này. Chuyển tiếp tham chiếu cho phép các thành phần lựa chọn để hiển thị bất kỳ tham chiếu nào của thành phần con là của chính chúng . Bạn có thể tìm thấy một ví dụ chi tiết về cách hiển thị nút DOM của con với thành phần chính trong tài liệu chuyển tiếp ref .
Nếu bạn sử dụng React 16.2 trở xuống hoặc nếu bạn cần sự linh hoạt hơn so với chuyển tiếp ref, bạn có thể sử dụng cách tiếp cận thay thế này và chuyển một cách rõ ràng một ref dưới dạng một prop có tên khác.
Khi có thể, chúng tôi khuyên bạn không nên để lộ các nút DOM, nhưng nó có thể là một lối thoát hữu ích. Lưu ý rằng cách tiếp cận này yêu cầu bạn thêm một số mã vào thành phần con. Nếu bạn hoàn toàn không có quyền kiểm soát việc triển khai thành phần con, tùy chọn cuối cùng của bạn là sử dụng findDOMNode()
, nhưng nó không được khuyến khích và không được dùng nữa StrictMode
.
Trên đây là một số thông tin về Ref trong ReactJs bạn có thể tham khảo thêm để ứng dụng vào các dự án sắp tới của mình! Bạn cũng có thể tìm hiểu thêm thông tin về ReactJs qua khóa học lập trình ReactJs và các khóa học lập trình khác của Viện công nghệ thông tin T3H.