React淺析(七):ref使用

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

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

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

1、通過字符串定義

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

這種方式已經(jīng)不被react官方推薦了,會在將來的某個版本移除掉,推薦開發(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時,回調(diào)函數(shù)會接收當(dāng)前dom元素作為參數(shù),當(dāng)我們使用this.refs.inputRef時候,可以獲取到該節(jié)點元素,調(diào)用原生DOM API實現(xiàn)input的聚焦等多種方法。
該回調(diào)函數(shù)會等組件掛載完畢之后,或者是ref屬性發(fā)生變化的時候,回調(diào)函數(shù)就會被調(diào)用。

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

實際場景中,當(dāng)我們使用this.refs.inputRef是一個獨立的dom元素,如果是屬于字符串引用,那么是無法知道inputRef什么時候卸載,也無法合理的銷毀,如果使用回調(diào)函數(shù),即當(dāng)發(fā)生父組件觸發(fā)卸載,子組件觸發(fā)回調(diào)函數(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對象
render的時候,接收子組件或者dom元素的ref屬性
用this.inputRef.current來獲取這個節(jié)點元素

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

因為ref引用的是組件的實例,無狀態(tài)組件中是沒有實例的。

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

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

但是function申明的組件內(nèi)部還是可以使用ref的,只要這個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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容