forwardRef 有什么作用?

在 React 的生態(tài)系統(tǒng)中匆篓,forwardRef 是一個強大的工具颂碧,尤其是當你需要在組件之間傳遞 ref 時鳍置。在本文中弦聂,我們將深入探討 forwardRef 的各種用法。

什么是 forwardRef?

forwardRef 是一個函數(shù),它接收一個渲染函數(shù)作為參數(shù)。這個渲染函數(shù)接收 props 和 ref 作為參數(shù),并返回一個 React 節(jié)點桃焕。

React.forwardRef((props, ref) => {
  return <div ref={ref} />;
});

為什么要使用 forwardRef?

在 React 中,ref 是一個特殊的屬性捧毛,它可以用來引用組件或 DOM 元素观堂。當你在組件中使用 ref 時,你可以通過 ref.current 來訪問組件或 DOM 元素呀忧。

用法

1. 傳遞 ref 給 DOM 元素

forwardRef 的主要功能是將引用 (ref) 從父組件轉(zhuǎn)發(fā)到子組件师痕。這對于訪問子組件的 DOM 元素非常有用。

::: details demo 代碼 <<< @/components/react/hooks/forwardRef/ForwardRefDom.jsx :::

在這個例子中而账,F(xiàn)ancyButton 組件使用 forwardRef 來接收一個 ref 并將其傳遞給內(nèi)部的 Button 組件胰坟。由于 ref 已經(jīng)被轉(zhuǎn)發(fā)到 Button 組件,我們可以直接通過 ref.current 訪問到 DOM 元素泞辐。在 App 組件中笔横,當按鈕被點擊時,我們使用 ref.current 來更改按鈕的字體顏色和背景色咐吼。

2. 在高階組件中使用 forwardRef

forwardRef 也可以在高階組件中使用吹缔。在這種情況下,ref 參數(shù)不會作為 props 傳遞給組件锯茄,而是作為第二個參數(shù)傳遞給渲染函數(shù)厢塘。

::: details demo 代碼 <<< @/components/react/hooks/forwardRef/WithBorderApp.jsx :::

在這個例子中,我們創(chuàng)建了一個 withBorder 高階組件肌幽,它為傳入的組件添加了一個藍色的邊框晚碾。在 App 組件中,我們創(chuàng)建了一個 ref 并將其傳遞給 ButtonWithBorder喂急。然后格嘁,我們可以使用這個 ref 來訪問 SimpleButton 的 DOM 元素,并調(diào)用其 innerText 更改按鈕的文本廊移。

3. 與 useImperativeHandle 配合使用

forwardRef 還可以與 useImperativeHandle 配合使用讥蔽。useImperativeHandle 可以讓你在使用 ref 時自定義暴露給父組件的實例值。

::: details demo 代碼 <<< @/components/react/hooks/forwardRef/ForwardedInput.jsx :::

總結(jié)

forwardRef 提供了一種在 React 組件中傳遞 ref 的強大方法画机。通過上述示例,我們可以看到它在各種場景中的應用新症,從基本的函數(shù)組件到高階組件步氏,再到與其他 React Hooks 的結(jié)合使用。掌握 forwardRef 可以幫助你更好地管理組件間的交互和引用徒爹,從而提高應用的靈活性和可維護性荚醒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芋类,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子界阁,更是在濱河造成了極大的恐慌侯繁,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泡躯,死亡現(xiàn)場離奇詭異贮竟,居然都是意外死亡,警方通過查閱死者的電腦和手機较剃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門咕别,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人写穴,你說我怎么就攤上這事惰拱。” “怎么了啊送?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵偿短,是天一觀的道長。 經(jīng)常有香客問我馋没,道長昔逗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任披泪,我火速辦了婚禮纤子,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘款票。我一直安慰自己控硼,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布艾少。 她就那樣靜靜地躺著卡乾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缚够。 梳的紋絲不亂的頭發(fā)上幔妨,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音谍椅,去河邊找鬼误堡。 笑死,一個胖子當著我的面吹牛雏吭,可吹牛的內(nèi)容都是我干的锁施。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悉抵!你這毒婦竟也來了肩狂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤姥饰,失蹤者是張志新(化名)和其女友劉穎傻谁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體列粪,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡审磁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篱竭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片力图。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掺逼,靈堂內(nèi)的尸體忽然破棺而出吃媒,到底是詐尸還是另有隱情,我是刑警寧澤吕喘,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布赘那,位于F島的核電站,受9級特大地震影響氯质,放射性物質(zhì)發(fā)生泄漏募舟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一闻察、第九天 我趴在偏房一處隱蔽的房頂上張望拱礁。 院中可真熱鬧,春花似錦辕漂、人聲如沸呢灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸯乃。三九已至,卻和暖如春跋涣,著一層夾襖步出監(jiān)牢的瞬間缨睡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工陈辱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奖年,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓沛贪,卻偏偏與公主長得像拾并,于是被迫代替她去往敵國和親揍堰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容