關(guān)于react中refs的使用

在react中,可以使用refs來(lái)訪(fǎng)問(wèn)dom睁蕾,或者在render中創(chuàng)建react對(duì)象苞笨。

使用refs的主要用途是

  1. 做一些動(dòng)畫(huà)的交互
  2. 媒體控件的播放
  3. 獲取焦點(diǎn)债朵、獲取文本等

使用refs的方式有兩種,一種是使React.createRef() API瀑凝,另一種是使用 回調(diào)形式的refs序芦。

先來(lái)介紹第一種方式,使用React.createRef() API


import React, { Component } from 'react'
export default class App extends React.Component {
  constructor(props) {
    super(props);
    // 創(chuàng)建一個(gè) ref 來(lái)存儲(chǔ) textInput 的 DOM 元素
    this.textInput = React.createRef();
    this.focusTextInput = this.focusTextInput.bind(this);
  }

  focusTextInput() {
    // 直接使用原生 API 使 text 輸入框獲得焦點(diǎn)
    // 注意:我們通過(guò) "current" 來(lái)訪(fǎng)問(wèn) DOM 節(jié)點(diǎn)
    this.textInput.current.focus();
    console.log(this.textInput.current);//這邊輸出input的dom對(duì)象
  }

  render() {
    // 告訴 React 我們想把 <input> ref 關(guān)聯(lián)到
    // 構(gòu)造器里創(chuàng)建的 `textInput` 上
    return (
      <div>
        <input
          type="text"
          ref={this.textInput} />

        <input
          type="button"
          value="點(diǎn)擊我獲取焦點(diǎn)"
          onClick={this.focusTextInput}
        />
      </div>
    );
   }
 }

第二種是回調(diào) Refs粤咪,React 將在組件掛載時(shí)谚中,會(huì)調(diào)用 ref 回調(diào)函數(shù)并傳入 DOM 元素,當(dāng)卸載時(shí)調(diào)用它并傳入 null射窒。在 componentDidMount 或 componentDidUpdate 觸發(fā)前藏杖,React 會(huì)保證 refs 一定是最新的。

import React, { Component } from 'react'
export default class App extends React.Component {
  constructor(props) {
    super(props);
    // 創(chuàng)建一個(gè) ref 來(lái)存儲(chǔ) textInput 的 DOM 元素
    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="點(diǎn)擊我獲取焦點(diǎn)"
          onClick={this.focusTextInput}
        />
      </div>
    );
  }
}

后面來(lái)講下蝌麸,父子組件怎么樣傳遞refs,你可以在組件間傳遞回調(diào)形式的 refs艾疟,代碼如下

import React, { Component } from 'react'
function CustomTextInput(props) {
  return (
    <div>
      <input ref={props.inputRef} />
    </div>
  );
}

class App extends React.Component {
  constructor(props) {
    super(props);
    // 創(chuàng)建一個(gè) ref 來(lái)存儲(chǔ) textInput 的 DOM 元素
    this.inputElement = null;
    this.setTextInputRef = element => {
      this.inputElement = element;
    };
    this.focusTextInput = () => {
      // 使用原生 DOM API 使 text 輸入框獲得焦點(diǎn)
      console.log(this.inputElement)
      if (this.inputElement) this.inputElement.focus();
    };
  }
  componentDidMount() {
    // 組件掛載后来吩,讓文本框自動(dòng)獲得焦點(diǎn)
    this.focusTextInput();
  }
  render() {
    return (
      <div> 
      <CustomTextInput
        inputRef={el => this.inputElement = el}
      />
      <input
          type="button"
          value="點(diǎn)擊我獲取焦點(diǎn)"
          onClick={this.focusTextInput}
        />
      </div>
    );
  }
}

在上面的例子中,App 把它的 refs 回調(diào)函數(shù)當(dāng)作 inputRef props 傳遞給了 CustomTextInput蔽莱,而且 CustomTextInput 把相同的函數(shù)作為特殊的 ref 屬性傳遞給了 <input>弟疆。結(jié)果是,在 App 中的 this.inputElement 會(huì)被設(shè)置為與 CustomTextInput 中的 input 元素相對(duì)應(yīng)的 DOM 節(jié)點(diǎn)盗冷。

使用 React.forwardRef 來(lái)獲取傳遞 ref怠苔,React 傳遞 ref 給 fowardRef 內(nèi)函數(shù) (props, ref) => ...,作為其第二個(gè)參數(shù)仪糖,然后轉(zhuǎn)發(fā)到它渲染的 DOM button

import React, { Component } from 'react'
const CustomTextInput = React.forwardRef((props, ref) => (
  <div>
      <input ref={ref} />
   </div>
));

class App extends React.Component {
  constructor(props) {
    super(props);
    // 創(chuàng)建一個(gè) ref 來(lái)存儲(chǔ) textInput 的 DOM 元素
    this.inputElement = React.createRef();
    this.focusTextInput = () => {
      // 使用原生 DOM API 使 text 輸入框獲得焦點(diǎn)
      console.log(this.inputElement)
      this.inputElement.current.focus();
    };
  }

  render() {
    return (
      <div> 
      <CustomTextInput
        ref={this.inputElement}
      />
      <input
          type="button"
          value="點(diǎn)擊我獲取焦點(diǎn)"
          onClick={this.focusTextInput}
        />
      </div>
    );
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柑司,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锅劝,更是在濱河造成了極大的恐慌攒驰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故爵,死亡現(xiàn)場(chǎng)離奇詭異玻粪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诬垂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)劲室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人剥纷,你說(shuō)我怎么就攤上這事痹籍。” “怎么了晦鞋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蹲缠,是天一觀的道長(zhǎng)棺克。 經(jīng)常有香客問(wèn)我,道長(zhǎng)线定,這世上最難降的妖魔是什么娜谊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮斤讥,結(jié)果婚禮上纱皆,老公的妹妹穿的比我還像新娘。我一直安慰自己芭商,他們只是感情好派草,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著铛楣,像睡著了一般近迁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上簸州,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天鉴竭,我揣著相機(jī)與錄音,去河邊找鬼岸浑。 笑死搏存,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矢洲。 我是一名探鬼主播璧眠,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼读虏!你這毒婦竟也來(lái)了蛆橡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掘譬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后呻拌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體葱轩,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年藐握,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靴拱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猾普,死狀恐怖袜炕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情初家,我是刑警寧澤偎窘,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布乌助,位于F島的核電站,受9級(jí)特大地震影響陌知,放射性物質(zhì)發(fā)生泄漏他托。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一仆葡、第九天 我趴在偏房一處隱蔽的房頂上張望赏参。 院中可真熱鬧,春花似錦沿盅、人聲如沸把篓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)韧掩。三九已至,卻和暖如春南窗,著一層夾襖步出監(jiān)牢的瞬間揍很,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工万伤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窒悔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓敌买,卻偏偏與公主長(zhǎng)得像简珠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虹钮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • It's a common pattern in React to wrap a component in an ...
    jplyue閱讀 3,272評(píng)論 0 2
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,070評(píng)論 2 35
  • refs提供了一種方法聋庵,用于訪(fǎng)問(wèn)在render中創(chuàng)建的dom節(jié)點(diǎn)或者React元素。 在典型的React數(shù)據(jù)流中芙粱,...
    XKolento閱讀 1,413評(píng)論 0 3
  • 3. JSX JSX是對(duì)JavaScript語(yǔ)言的一個(gè)擴(kuò)展語(yǔ)法祭玉, 用于生產(chǎn)React“元素”,建議在描述UI的時(shí)候...
    pixels閱讀 2,828評(píng)論 0 24
  • 連續(xù)靈修97天經(jīng)文 【詩(shī)30:5】因?yàn)榇号希呐瓪獠贿^(guò)是轉(zhuǎn)眼之間脱货,他的恩典乃是一生之久。一宿雖然有哭泣律姨,早晨便必歡呼...
    報(bào)佳音閱讀 561評(píng)論 0 0