您現在所在位置: 主頁(yè) > APP開(kāi)發(fā)
React Ref TypeScript 用法
更新時(shí)間:2026-05-05 00:10:53
React?? Ref 是用法 React 提供的一種方式,允許我們訪(fǎng)問(wèn) DOM 節點(diǎn)或者在 ren( ?ヮ?)der 方法中創(chuàng )建的用法 React 元素,通常情況下,用法我們會(huì )避免直接操作 DOM,用法而選擇使用 React( ?ヮ?) 提供的用法狀態(tài)(state)和屬性(props)來(lái)更??新視圖,有些情況下,用法我們需要直接操作 DOM,用法這時(shí)候就需要使用 Refs。用法
(圖片來(lái)源網(wǎng)絡(luò ),(′;д;`)用法侵刪)在 Typ( ?ヮ?)eScript 中,用法我們可以使用 React.RefObject<T> 類(lèi)型來(lái)聲明一?個(gè) Ref,用法這個(gè)(ge)類(lèi)型表示一個(gè)可以附加到任何可渲染對象的用法引用,例如一個(gè) DOM 元素或者一個(gè)類(lèi)組件實(shí)例,用法下面是用法一個(gè)簡(jiǎn)單的例子:
import React, { useR(′?`)ef } from 'react';function TextInputWithFoc??usButton() { const inputEl = useRef<HTMLInputElement>(null); const onButtonClick = () => { // curren(′ω`*)t 屬性會(huì )被初始化為存儲在 useRef?? 中的值 inputEl.current?.focus(); }; return ( <> <input ref={ inputEl} tyヽ(′ー`)ノpe="text" /> <button onClick={ onButtonClick}>聚焦輸入框</button> </&??gt; );}在這個(gè)例子中,我們使用 useRef 創(chuàng )建了一個(gè) Ref,用法并將其存儲在 inputEl 變量中,我們將這個(gè) Ref 附加到 <input> 元素上,當用戶(hù)點(diǎn)擊按鈕時(shí),我們可以通過(guò) inputEl.curr(′_ゝ`)ent 訪(fǎng)問(wèn)到這個(gè)元素,并調用 foc(???)us 方法使其獲得焦點(diǎn),需要注意的是,我們需要(yao)使用可選鏈操作符(?.)來(lái)(?Д?)確保 curren(′_`)t 屬性存在,這是因為ヽ(′▽?zhuān)?/在某些情(′▽?zhuān)?)況下,例如組件卸載時(shí),useRef 存儲的值可能會(huì )被清除。
除了 use?Ref,我們??還可以使用 createRef API 來(lái)創(chuàng )建一個(gè) Ref,下面是一個(gè)例子:
import React, { useRef, createRef } from 'react';function TextInputWithFocus??Button??() { const inp(??ヮ?)?*:???utE??l = createRef<HTMLInputElement>(); const onButtonClick = () => { inputEl.current?.focus(); }; return ( <> <input ref={ inputEl} type="text" /> <button onClick={ onB(′▽?zhuān)?uttonClick}>聚焦輸入框</button> </> );}在這個(gè)例子中,我們使用 createRe??f 創(chuàng )建了一個(gè) Ref,并將其存儲在 inputEl 變量中,我們將這個(gè) Ref 附加到 <input> 元素上,?當用戶(hù)點(diǎn)擊按鈕時(shí),我們可以通過(guò) inputEl.current 訪(fǎng)問(wèn)到這個(gè)元素,并調用 focus 方法使其獲得焦點(diǎn),同樣需要注意的是,我們需要使用可選鏈操作符來(lái)確保 curre(/ω\)nt 屬性存在。
我們可能需要在多個(gè)組件之間共享一個(gè) Ref,為了實(shí)現這一點(diǎn),我們可以將 Ref 作為 prop 傳遞給子組ヽ(′▽?zhuān)?ノ件,下面是一個(gè)例子:
import React, { useRef, forwardRef } from 'react';cons(╯°□°)╯︵ ┻━┻t FancyText(╯‵□′)╯Input = forwardRef<HTMLInputElement, string>((p??rops, ref) => { return <input ref={ ref} type="text( ?° ?? ?°)" classN( ?▽?)ame="fancy??" />;}??);functi??on App() { const inputEl = useRef<HTMLInputElement>(null); const handleButtonClick = () => { inputEl.current?.fo(????)cus(); }; return ( <di?v> <FancyTextInput ref={ inputEl} /> <bu(′;д;`)tton on??Click={ handleButtonClick}>聚焦輸入框</button> </div> );}在這個(gè)例子中,我們使用 forwardRef API 創(chuàng )建了一個(gè)名為 FancyTextInput 的自定義組件,這個(gè)組件接受一個(gè)名為 ref 的 prop,并將其附加到內(′?`*)部的 <input>ヾ(′▽?zhuān)?? 元素上,我們在 App 組件中使用這個(gè)自定義組件,并將一個(gè) Ref 作為 prop 傳遞給它,當用戶(hù)點(diǎn)擊按鈕時(shí),我們可以通過(guò) inputEl.current 訪(fǎng)問(wèn)到這個(gè)元素,并調用 focus 方法使其獲得焦點(diǎn),需要注意的是,由于(yu)我們使用了 forwardRef,所以┐(′?`)┌我們不需要(′?ω?`)使用可選鏈操作符來(lái)確保 current 屬性存在。

