詳解React中如何獲取真實(shí)的dom
在 React 中,獲取真實(shí)的 DOM 元素通常通過(guò) ref 來(lái)實(shí)現(xiàn)。ref 是一個(gè)特殊的屬性,用于引用組件或 DOM 元素的實(shí)例。你可以通過(guò) ref 獲取到組件的真實(shí) DOM 元素或組件實(shí)例。
1. 函數(shù)組件中的 useRef
在函數(shù)組件中,獲取 DOM 元素的引用需要使用 useRef 鉤子。
示例:函數(shù)組件中的 useRef 用法
import React, { useRef } from 'react'; function MyComponent() { // 創(chuàng)建一個(gè) ref 來(lái)引用 DOM 元素 const inputRef = useRef(null); const focusInput = () => { // 通過(guò) ref 訪問(wèn)真實(shí)的 DOM 元素,并給它添加焦點(diǎn) inputRef.current.focus(); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={focusInput}>Focus the input</button> </div> ); } export default MyComponent;
解釋:
useRef 返回一個(gè)包含 .current 屬性的對(duì)象,current 可以指向真實(shí)的 DOM 元素(或者組件實(shí)例,具體取決于 ref 的用途)。
在這個(gè)例子中,inputRef.current 會(huì)指向 <input> 元素本身,你可以通過(guò)它訪問(wèn) 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 = () => { // 通過(guò) ref 訪問(wèn)真實(shí)的 DOM 元素,并給它添加焦點(diǎn) 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)建一個(gè) ref 對(duì)象,this.inputRef.current 指向 DOM 元素(在此例中是 <input> 元素)。
focusInput 方法通過(guò) this.inputRef.current.focus() 調(diào)用 DOM 方法來(lái)聚焦輸入框。
3. 訪問(wèn) DOM 元素的常見(jiàn)用途
獲取輸入框的值:你可以通過(guò) ref 獲取到輸入框的值,雖然在大多數(shù)情況下,React 推薦使用受控組件來(lái)管理輸入框的值,但有時(shí)直接訪問(wèn) DOM 元素可能更簡(jiǎn)單。
示例:
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> ); }
控制焦點(diǎn):ref 可以用來(lái)控制元素的焦點(diǎn)(如前面的例子),讓用戶能夠交互時(shí)快速導(dǎo)航到特定的輸入框。
DOM 操作:你還可以直接操作 DOM 元素的其他屬性,如添加事件監(jiān)聽(tīng)器、獲取元素尺寸、滾動(dòng)等。
4. 使用 ref 獲取自定義組件的實(shí)例
除了 DOM 元素,ref 還可以用來(lái)獲取類組件的實(shí)例。
示例:獲取類組件實(shí)例
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 會(huì)指向子組件 MyButton 的實(shí)例,因此你可以直接調(diào)用它的方法(如 clickHandler())。
ref 對(duì)于類組件和函數(shù)組件的使用方式略有不同,但它們的核心思想相同:通過(guò) ref 獲取實(shí)例或 DOM 元素的引用。
5. 注意事項(xiàng)
避免過(guò)度使用 ref:在 React 中,ref 是一種“逃逸機(jī)制”,它繞過(guò)了 React 的數(shù)據(jù)流和狀態(tài)管理。盡量避免在沒(méi)有必要的情況下使用 ref,推薦使用 React 的狀態(tài)和 props 來(lái)管理數(shù)據(jù)和交互。
ref 只在渲染完成后有效:ref 只能在組件渲染完成后訪問(wèn)到 DOM 元素。因此,在 componentDidMount 或 useEffect 中使用 ref 時(shí),要確保渲染已經(jīng)完成。
6.總結(jié)
在 函數(shù)組件 中,使用 useRef 來(lái)獲取真實(shí)的 DOM 元素。
在 類組件 中,使用 React.createRef() 來(lái)獲取真實(shí)的 DOM 元素。
ref 用于訪問(wèn) DOM 元素或組件實(shí)例,可以用于獲取值、控制焦點(diǎn)或執(zhí)行其他 DOM 操作。
到此這篇關(guān)于詳解React中如何獲取真實(shí)的dom的文章就介紹到這了,更多相關(guān)React獲取真實(shí)dom內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Cloud?Studio構(gòu)建React完成點(diǎn)餐H5頁(yè)面(騰訊云?Cloud?Studio?實(shí)戰(zhàn)訓(xùn)練營(yíng))
最近也是有機(jī)會(huì)參與到了騰訊云舉辦的騰訊云Cloud Studio實(shí)戰(zhàn)訓(xùn)練營(yíng),借此了解了騰訊云Cloud?Studio產(chǎn)品,下面就來(lái)使用騰訊云Cloud?Studio做一個(gè)實(shí)戰(zhàn)案例來(lái)深入了解該產(chǎn)品的優(yōu)越性吧,感興趣的朋友跟隨小編一起看看吧2023-08-08React配置Redux并結(jié)合本地存儲(chǔ)設(shè)置token方式
這篇文章主要介紹了React配置Redux并結(jié)合本地存儲(chǔ)設(shè)置token方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01React源碼分析之useCallback與useMemo及useContext詳解
這篇文章主要介紹了React useCallback與useMemo及useContext源碼分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-11-11react-draggable實(shí)現(xiàn)拖拽功能實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于react-draggable實(shí)現(xiàn)拖拽功能的相關(guān)資料,React-Draggable一個(gè)使元素可拖動(dòng)的簡(jiǎn)單組件,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08react-native 封裝視頻播放器react-native-video的使用
本文主要介紹了react-native 封裝視頻播放器react-native-video的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01