詳解React中如何獲取真實的dom
在 React 中,獲取真實的 DOM 元素通常通過 ref 來實現(xiàn)。ref 是一個特殊的屬性,用于引用組件或 DOM 元素的實例。你可以通過 ref 獲取到組件的真實 DOM 元素或組件實例。
1. 函數(shù)組件中的 useRef
在函數(shù)組件中,獲取 DOM 元素的引用需要使用 useRef 鉤子。
示例:函數(shù)組件中的 useRef 用法
import React, { useRef } from 'react';
function MyComponent() {
// 創(chuàng)建一個 ref 來引用 DOM 元素
const inputRef = useRef(null);
const focusInput = () => {
// 通過 ref 訪問真實的 DOM 元素,并給它添加焦點
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={focusInput}>Focus the input</button>
</div>
);
}
export default MyComponent;
解釋:
useRef 返回一個包含 .current 屬性的對象,current 可以指向真實的 DOM 元素(或者組件實例,具體取決于 ref 的用途)。
在這個例子中,inputRef.current 會指向 <input> 元素本身,你可以通過它訪問 DOM 元素的屬性和方法(例如 focus())。
2. 類組件中的 createRef
在類組件中,獲取 DOM 元素的引用需要使用 React.createRef() 方法。
示例:類組件中的 createRef 用法
import React, { Component } from 'react';
class MyComponent extends Component {
// 在類組件中創(chuàng)建 ref
constructor(props) {
super(props);
this.inputRef = React.createRef();
}
focusInput = () => {
// 通過 ref 訪問真實的 DOM 元素,并給它添加焦點
this.inputRef.current.focus();
};
render() {
return (
<div>
<input ref={this.inputRef} type="text" />
<button onClick={this.focusInput}>Focus the input</button>
</div>
);
}
}
export default MyComponent;
解釋:
React.createRef() 用于在類組件中創(chuàng)建一個 ref 對象,this.inputRef.current 指向 DOM 元素(在此例中是 <input> 元素)。
focusInput 方法通過 this.inputRef.current.focus() 調(diào)用 DOM 方法來聚焦輸入框。
3. 訪問 DOM 元素的常見用途
獲取輸入框的值:你可以通過 ref 獲取到輸入框的值,雖然在大多數(shù)情況下,React 推薦使用受控組件來管理輸入框的值,但有時直接訪問 DOM 元素可能更簡單。
示例:
function MyComponent() {
const inputRef = useRef(null);
const handleSubmit = () => {
alert(`Input value: ${inputRef.current.value}`);
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={handleSubmit}>Submit</button>
</div>
);
}
控制焦點:ref 可以用來控制元素的焦點(如前面的例子),讓用戶能夠交互時快速導航到特定的輸入框。
DOM 操作:你還可以直接操作 DOM 元素的其他屬性,如添加事件監(jiān)聽器、獲取元素尺寸、滾動等。
4. 使用 ref 獲取自定義組件的實例
除了 DOM 元素,ref 還可以用來獲取類組件的實例。
示例:獲取類組件實例
import React, { Component } from 'react';
class MyButton extends Component {
clickHandler() {
alert('Button clicked!');
}
render() {
return <button onClick={this.clickHandler}>Click Me</button>;
}
}
class ParentComponent extends Component {
constructor(props) {
super(props);
this.buttonRef = React.createRef();
}
triggerButtonClick = () => {
this.buttonRef.current.clickHandler(); // 調(diào)用子組件的方法
};
render() {
return (
<div>
<MyButton ref={this.buttonRef} />
<button onClick={this.triggerButtonClick}>Trigger Child Button Click</button>
</div>
);
}
}
export default ParentComponent;
解釋:
this.buttonRef.current 會指向子組件 MyButton 的實例,因此你可以直接調(diào)用它的方法(如 clickHandler())。
ref 對于類組件和函數(shù)組件的使用方式略有不同,但它們的核心思想相同:通過 ref 獲取實例或 DOM 元素的引用。
5. 注意事項
避免過度使用 ref:在 React 中,ref 是一種“逃逸機制”,它繞過了 React 的數(shù)據(jù)流和狀態(tài)管理。盡量避免在沒有必要的情況下使用 ref,推薦使用 React 的狀態(tài)和 props 來管理數(shù)據(jù)和交互。
ref 只在渲染完成后有效:ref 只能在組件渲染完成后訪問到 DOM 元素。因此,在 componentDidMount 或 useEffect 中使用 ref 時,要確保渲染已經(jīng)完成。
6.總結(jié)
在 函數(shù)組件 中,使用 useRef 來獲取真實的 DOM 元素。
在 類組件 中,使用 React.createRef() 來獲取真實的 DOM 元素。
ref 用于訪問 DOM 元素或組件實例,可以用于獲取值、控制焦點或執(zhí)行其他 DOM 操作。
到此這篇關(guān)于詳解React中如何獲取真實的dom的文章就介紹到這了,更多相關(guān)React獲取真實dom內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React Native全面屏狀態(tài)欄和底部導航欄適配教程詳細講解
最近在寫 React Native 項目,調(diào)試應用時發(fā)現(xiàn)頂部狀態(tài)欄和底部全面屏手勢指示條區(qū)域不是透明的,看起來很難受。研究了一下這個問題,現(xiàn)在總結(jié)一下解決方案,這篇文章主要介紹了React Native全面屏狀態(tài)欄和底部導航欄適配教程2023-01-01
React?Hooks中?useRef和useImperativeHandle的使用方式
這篇文章主要介紹了React?Hooks中?useRef和useImperativeHandle的使用方式,文中說明了useRef和useCallback一起使用,?可以解決閉包陷阱的問題,本文結(jié)合實例代碼介紹的非常詳細,需要的朋友可以參考下2023-10-10
React實現(xiàn)父組件調(diào)用子組件的兩種寫法
react通信分很多種,比如:父子通信,兄弟通信等等,這里我們就簡單說一下父子通信,父子通信分為:父組件調(diào)用子組件里面的方法;子組件調(diào)用子組件里面的方法,這里我們著重說一下父組件調(diào)用子組件,需要的朋友可以參考下2024-04-04
關(guān)于react-router中的Prompt組件使用心得
這篇文章主要介紹了關(guān)于react-router中的Prompt組件學習心得,Prompt組件作用是,在用戶準備離開該頁面時,?彈出提示,?返回true或者false,?如果為true,?則離開頁面,?如果為false,?則停留在該頁面,本文結(jié)合示例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01
React+Node.js實現(xiàn)大文件傳輸與斷點續(xù)傳
這篇文章主要為大家詳細介紹了如何使用React前端和Node.js后端實現(xiàn)大文件傳輸和斷點續(xù)傳的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以參考下2024-12-12

