React淺析(七):ref使用

在React等框架出現(xiàn)之前德撬,web頁面的交互是依靠操作DOM實(shí)現(xiàn)的昆庇,到了出現(xiàn)vdom概念出來,React和Vue等框架利用組件的狀態(tài)管理凝颇,通過操作dom的js對(duì)象潘拱,來實(shí)現(xiàn)頁面的變化渲染。在React的數(shù)據(jù)流中拧略,是自上向下的props傳遞數(shù)據(jù)芦岂,我們可以通過props來讓子組件重新渲染,然而實(shí)際場景中垫蛆,我們還是需要按照我們的方式來操作元素的行為禽最,這個(gè)時(shí)候就需要用到ref來獲取某元素dom節(jié)點(diǎn)

比如:需要focus一個(gè)input輸入框,讓媒體播放

使用ref的方式:
1袱饭、通過字符串定義獲取
2川无、通過回調(diào)函數(shù)的方式去使用
3、使用React.createRef()

1虑乖、通過字符串定義

 <input type='text' ref='inputRef' />
//訪問時(shí)
console.log(this.refs.inputRef)

這種方式已經(jīng)不被react官方推薦了懦趋,會(huì)在將來的某個(gè)版本移除掉,推薦開發(fā)者使用回調(diào)的方式疹味。


官網(wǎng)截圖.png

2仅叫、通過回調(diào)函數(shù)的方式去使用

class Home  extends Component{
    constructor(){
        super()
    }
   render(){
      return(
        <div>
           <input
              ref={c => {
              this.inputRef = c;}}
            />
        </div>
      )
    }
}

上面栗子中,當(dāng)我們使用ref時(shí)糙捺,回調(diào)函數(shù)會(huì)接收當(dāng)前dom元素作為參數(shù)诫咱,當(dāng)我們使用this.refs.inputRef時(shí)候,可以獲取到該節(jié)點(diǎn)元素洪灯,調(diào)用原生DOM API實(shí)現(xiàn)input的聚焦等多種方法坎缭。
該回調(diào)函數(shù)會(huì)等組件掛載完畢之后,或者是ref屬性發(fā)生變化的時(shí)候签钩,回調(diào)函數(shù)就會(huì)被調(diào)用幻锁。

以上兩種方法,可以思考下边臼,為什么要廢除掉字符串的引用,改為回調(diào)函數(shù)的方式的好處是什么假消?

實(shí)際場景中柠并,當(dāng)我們使用this.refs.inputRef是一個(gè)獨(dú)立的dom元素,如果是屬于字符串引用富拗,那么是無法知道inputRef什么時(shí)候卸載臼予,也無法合理的銷毀,如果使用回調(diào)函數(shù)啃沪,即當(dāng)發(fā)生父組件觸發(fā)卸載粘拾,子組件觸發(fā)回調(diào)函數(shù),可以在此時(shí)將inputRef銷毀掉创千。

3缰雇、使用React.createRef()

用React.createRef()創(chuàng)建refs入偷,通過ref屬性

class Home  extends Component{
    constructor(){
        super()
        this.inputRef = React.createRef()
    }
   render(){
      return(
        <div>
           <input
              ref={ this.inputRef}
            />
        </div>
      )
    }
}
//使用
//this.inputRef.current.focus()

使用createRef方法,生成ref對(duì)象
render的時(shí)候械哟,接收子組件或者dom元素的ref屬性
用this.inputRef.current來獲取這個(gè)節(jié)點(diǎn)元素

注意:不能在無狀態(tài)組件中使用ref

因?yàn)閞ef引用的是組件的實(shí)例疏之,無狀態(tài)組件中是沒有實(shí)例的。

function MyComponent() {
    return <input />;
}

class Home extends React.Component {
    render() {
        return (
            <MyComponent
                ref={(input) => { this.textInput = input; }} />
        );
    }
}
//以上代碼是無效的

但是function申明的組件內(nèi)部還是可以使用ref的暇咆,只要這個(gè)ref不是用來訪問function組件

function MyComponent (){
  let inputRef = React.createRef()
  return (
    <div>
      <input ref={inputRef}  type='text'/>
    </div>
  )  
}
//如何使用
//inputRef.current.focus()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锋爪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爸业,更是在濱河造成了極大的恐慌其骄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扯旷,死亡現(xiàn)場離奇詭異拯爽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)薄霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門某抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惰瓜,你說我怎么就攤上這事否副。” “怎么了崎坊?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵备禀,是天一觀的道長。 經(jīng)常有香客問我奈揍,道長曲尸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任男翰,我火速辦了婚禮另患,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛾绎。我一直安慰自己昆箕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布租冠。 她就那樣靜靜地躺著鹏倘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顽爹。 梳的紋絲不亂的頭發(fā)上纤泵,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音镜粤,去河邊找鬼捏题。 笑死玻褪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涉馅。 我是一名探鬼主播归园,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稚矿!你這毒婦竟也來了庸诱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤晤揣,失蹤者是張志新(化名)和其女友劉穎桥爽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧识,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钠四,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跪楞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀去。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甸祭,靈堂內(nèi)的尸體忽然破棺而出缕碎,到底是詐尸還是另有隱情,我是刑警寧澤池户,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布咏雌,位于F島的核電站,受9級(jí)特大地震影響校焦,放射性物質(zhì)發(fā)生泄漏赊抖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一寨典、第九天 我趴在偏房一處隱蔽的房頂上張望氛雪。 院中可真熱鬧,春花似錦耸成、人聲如沸报亩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赚楚,卻和暖如春毙沾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宠页。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工左胞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寇仓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓烤宙,卻偏偏與公主長得像遍烦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躺枕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • It's a common pattern in React to wrap a component in an ...
    jplyue閱讀 3,265評(píng)論 0 2
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,063評(píng)論 2 35
  • 以下內(nèi)容是我在學(xué)習(xí)和研究React時(shí)服猪,對(duì)React的特性、重點(diǎn)和注意事項(xiàng)的提取拐云、精練和總結(jié)罢猪,可以做為React特性...
    科研者閱讀 8,232評(píng)論 2 21
  • 從“惟妙惟肖”說起吧薇缅。 肖危彩,《說文解字》云:“骨肉相似也∮捐耄”汤徽,就是說人與人雖然皮毛容貌有所區(qū)別,但是筋骨肌肉卻極為...
    云道生閱讀 407評(píng)論 0 0
  • 這個(gè)問題的關(guān)鍵在于,沒有庫里的勇士所呈現(xiàn)的狀態(tài)到底是怎樣的梧奢?這也的狀態(tài)是否也能對(duì)火箭造成威脅嗎狱掂? 在3月24號(hào)庫里...
    籃球行為大賞閱讀 238評(píng)論 0 0