React refs 的理解


 

 

一、是什么

Refs 在計算機中稱為彈性文件系統(英語:Resilient File System,簡稱ReFS)

React 中的 Refs提供了一種方式,允許我們訪問 DOM節點或在 render方法中創建的 React元素

本質為ReactDOM.render()返回的組件實例,如果是渲染組件則返回的是組件實例,如果渲染dom則返回的是具體的dom節點

二、如何使用

創建ref的形式有三種:

  • 傳入字符串,使用時通過 this.refs.傳入的字符串的格式獲取對應的元素
  • 傳入對象,對象是通過 React.createRef()  方式創建出來,使用時獲取到創建的對象中存在 current 屬性就是對應的元素
  • 傳入函數,該函數會在 DOM 被掛載時進行回調,這個函數會傳入一個 元素對象,可以自己保存,使用時,直接拿到之前保存的元素對象即可
  • 傳入hook,hook是通過 useRef() 方式創建,使用時通過生成hook對象的 current 屬性就是對應的元素

傳入字符串

只需要在對應元素或組件中ref屬性

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref="myref" />;
  }
}
 

訪問當前節點的方式如下:

this.refs.myref.innerHTML = "hello";

傳入對象

refs通過React.createRef()創建,然后將ref屬性添加到React元素中,如下:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref={this.myRef} />;
  }
}

 

 

當 ref 被傳遞給 render 中的元素時,對該節點的引用可以在 ref 的 current 屬性中訪問

const node = this.myRef.current;

傳入函數

ref傳入為一個函數的時候,在渲染過程中,回調函數參數會傳入一個元素對象,然后通過實例將對象進行保存

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref={element => this.myref = element} />;
  }
}

 

 

獲取ref對象只需要通過先前存儲的對象即可

const node = this.myref 

傳入hook

通過useRef創建一個ref,整體使用方式與React.createRef一致

function App(props) {
  const myref = useRef()
  return (
    <>
      <div ref={myref}></div>
    </>
  )
}

 

 

獲取ref屬性也是通過hook對象的current屬性

const node = myref.current;

上述三種情況都是ref屬性用於原生HTML元素上,如果ref設置的組件為一個類組件的時候,ref對象接收到的是組件的掛載實例

注意的是,不能在函數組件上使用ref屬性,因為他們並沒有實例

三、應用場景

在某些情況下,我們會通過使用refs來更新組件,但這種方式並不推薦,更多情況我們是通過propsstate的方式進行去重新渲染子元素

過多使用refs,會使組件的實例或者是DOM結構暴露,違反組件封裝的原則

例如,避免在 Dialog 組件里暴露 open() 和 close() 方法,最好傳遞 isOpen 屬性

但下面的場景使用refs非常有用:

  • 對Dom元素的焦點控制、內容選擇、控制
  • 對Dom元素的內容設置及媒體播放
  • 對Dom元素的操作和對組件實例的操作
  • 集成第三方 DOM 庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM