關(guān)于Ref

ref

Refs 提供了一種方式馆里,允許我們?cè)L問(wèn) DOM 節(jié)點(diǎn)或在 render 方法中創(chuàng)建的 React 元素

Refs 是使用 React.createRef() 創(chuàng)建的衣厘,并通過(guò) ref 屬性附加到 React 元素假夺。在構(gòu)造組件時(shí),通常將 Refs 分配給實(shí)例屬性疲憋,以便可以在整個(gè)組件中引用它們控漠。

當(dāng) ref 被傳遞給 render 中的元素時(shí)洛波,對(duì)該節(jié)點(diǎn)的引用可以在 ref 的 current 屬性中被訪問(wèn)巩搏。

const node = this.myRef.current;

ref 的值根據(jù)節(jié)點(diǎn)的類(lèi)型而有所不同:

  • 當(dāng) ref 屬性用于 HTML 元素時(shí)扒秸,構(gòu)造函數(shù)中使用 React.createRef() 創(chuàng)建的 ref 接收底層 DOM 元素作為其 current 屬性播演。

  • 當(dāng) ref 屬性用于自定義 class 組件時(shí),ref 對(duì)象接收組件的掛載實(shí)例作為其 current 屬性伴奥。

  • 你不能在函數(shù)組件上使用 ref 屬性写烤,因?yàn)樗麄儧](méi)有實(shí)例,但是可以用useRef來(lái)獲取節(jié)點(diǎn)拾徙。

    function CustomTextInput(props) {
      // 這里必須聲明 textInput洲炊,這樣 ref 才可以引用它  
      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>
      );
    }
    

使用場(chǎng)景

  • 管理焦點(diǎn),文本選擇或媒體播放尼啡。
  • 觸發(fā)強(qiáng)制動(dòng)畫(huà)暂衡。
  • 集成第三方 DOM 庫(kù)。

避免使用 refs 來(lái)做任何可以通過(guò)聲明式實(shí)現(xiàn)來(lái)完成的事情

盡量不要向父組件暴露子組件DOM refs崖瞭,這就違背了封裝的原則狂巢,如果子組件的工作必須依賴于父組件,那為什么不寫(xiě)成一個(gè)組件呢书聚。但是官方文檔里也沒(méi)把話說(shuō)死唧领,因?yàn)樵跇O少數(shù)的業(yè)務(wù)情景之下藻雌,我們必須干這個(gè)事情才能實(shí)現(xiàn)某些功能,比如在高階組件中斩个,我們可以通過(guò)ref來(lái)獲得組件實(shí)例胯杭,在父組件中去執(zhí)行屬于子組件實(shí)例的一些方法。

回調(diào)Refs

它能助你更精細(xì)地控制何時(shí) refs 被設(shè)置和解除萨驶。

傳遞一個(gè)函數(shù)歉摧。這個(gè)函數(shù)中接受 React 組件實(shí)例或 HTML DOM 元素作為參數(shù),以使它們能在其他地方被存儲(chǔ)和訪問(wèn)腔呜。

class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);

    this.textInput = null;
    this.setTextInputRef = element => {      this.textInput = element;    };
    this.focusTextInput = () => {      // 使用原生 DOM API 使 text 輸入框獲得焦點(diǎn)      
        if (this.textInput) this.textInput.focus();    
    };  
  }

  componentDidMount() {
    // 組件掛載后,讓文本框自動(dòng)獲得焦點(diǎn)
    this.focusTextInput();  }

  render() {
    // 使用 `ref` 的回調(diào)函數(shù)將 text 輸入框 DOM 節(jié)點(diǎn)的引用存儲(chǔ)到 React
    // 實(shí)例上(比如 this.textInput)
    return (
      <div>
        <input
          type="text"
          ref={this.setTextInputRef}        />
        <input
          type="button"
          value="Focus the text input"
          onClick={this.focusTextInput}        />
      </div>
    );
  }
}

它的執(zhí)行時(shí)機(jī)是:

  • 組件被掛載后(componentDidMount)再悼,回調(diào)函數(shù)立即執(zhí)行核畴,回調(diào)函數(shù)的參數(shù)為該組件的實(shí)例。
  • 組件被卸載(componentDidUnmount)或者原有的 ref 屬性本身發(fā)生變化的時(shí)候冲九,此時(shí)回調(diào)函數(shù)也會(huì)立即執(zhí)行谤草,且回調(diào)函數(shù)的參數(shù)為 null。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莺奸,一起剝皮案震驚了整個(gè)濱河市丑孩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灭贷,老刑警劉巖温学,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異甚疟,居然都是意外死亡仗岖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)览妖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轧拄,“玉大人,你說(shuō)我怎么就攤上這事讽膏¢莸纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵府树,是天一觀的道長(zhǎng)俐末。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挺尾,這世上最難降的妖魔是什么鹅搪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮遭铺,結(jié)果婚禮上丽柿,老公的妹妹穿的比我還像新娘恢准。我一直安慰自己,他們只是感情好甫题,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布馁筐。 她就那樣靜靜地躺著,像睡著了一般坠非。 火紅的嫁衣襯著肌膚如雪敏沉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天炎码,我揣著相機(jī)與錄音盟迟,去河邊找鬼。 笑死潦闲,一個(gè)胖子當(dāng)著我的面吹牛攒菠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歉闰,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辖众,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了和敬?” 一聲冷哼從身側(cè)響起凹炸,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昼弟,沒(méi)想到半個(gè)月后啤它,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡私杜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蚕键,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衰粹。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锣光,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铝耻,到底是詐尸還是另有隱情誊爹,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布瓢捉,位于F島的核電站频丘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泡态。R本人自食惡果不足惜搂漠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望某弦。 院中可真熱鬧桐汤,春花似錦而克、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拣度,卻和暖如春碎绎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抗果。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工筋帖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冤馏。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓幕随,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宿接。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • React Refs React 支持一種非常特殊的屬性 Ref 辕录,你可以用來(lái)綁定到 render() 輸出的任何...
    Android_馮星閱讀 14,348評(píng)論 1 4
  • React的ref有3種用法: 字符串(已廢棄) 回調(diào)函數(shù) React.createRef() (React16....
    Sun____閱讀 818評(píng)論 0 0
  • ref的作用 ref 被用來(lái)給DOM元素或子組件注冊(cè)引用信息睦霎。引用信息會(huì)根據(jù)父組件的 $refs 對(duì)象進(jìn)行注冊(cè)。如...
    Mr無(wú)愧于心閱讀 2,750評(píng)論 1 1
  • 1.字符串 通過(guò) this.refs.demo 來(lái)引用真實(shí)dom的節(jié)點(diǎn),建議不要使用它走诞,因?yàn)樽址糜幸恍﹩?wèn)題副女,...
    鄒小小白閱讀 5,831評(píng)論 2 6
  • 關(guān)于 ref 注冊(cè)時(shí)間的重要說(shuō)明: 因?yàn)?ref 本身是作為渲染結(jié)果被創(chuàng)建的,在初始渲染的時(shí)候你不能訪問(wèn)它們 - ...
    輝湫閱讀 170評(píng)論 0 0