溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用React中的Ref

發(fā)布時間:2020-07-29 14:52:44 來源:億速云 閱讀:183 作者:小豬 欄目:web開發(fā)

這篇文章主要講解了如何使用React中的Ref,內(nèi)容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

React中Ref 的使用 React v16.6.3

在典型的React數(shù)據(jù)流中,props是父組件與其子組件交互的唯一方式。要修改子項,請使用new props 重新呈現(xiàn)它。但是,在某些情況下,需要在典型數(shù)據(jù)流之外強制修改子項。要修改的子項可以是React組件的實例,也可以是DOM元素。對于這兩種情況,React都提供了api。

何時使用refs

refs有一些很好的用例:

  • 1.文本選擇或媒體播放。
  • 2.觸發(fā)勢在必行的動畫。
  • 3.與第三方DOM庫集成。

避免將refs用于可以聲明性地完成的任何操作。

*不要過度使用Refs

舊版API:字符串引用

如果您之前使用過React,那么您可能熟悉一個舊的API,其中ref屬性是一個字符串"textInput",并且DOM節(jié)點被訪問為this.refs.textInput。建議不要使用它,因為字符串引用有一些問題,被認為是遺留問題,很可能會在未來的某個版本中刪除。

回調(diào)引用

當組件安裝時,React將使用DOM元素調(diào)用ref回調(diào),并在卸載時調(diào)用null。

在componentDidMount或componentDidUpdate觸發(fā)之前,Refs保證是最新的.

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

 this.textInput = null;

 this.setTextInputRef = element => {
  this.textInput = element;
 };

 this.focusTextInput = () => {
  // Focus the text input using the raw DOM API
  if (this.textInput) this.textInput.focus();
 };
 }

 componentDidMount() {
 // autofocus the input on mount
 this.focusTextInput();
 }

 render() {
 // Use the `ref` callback to store a reference to the text input DOM
 // element in an instance field (for example, this.textInput).
 return (
  <div>
  <input
   type="text"
   ref={this.setTextInputRef}
  />
  <input
   type="button"
   value="Focus the text input"
   onClick={this.focusTextInput}
  />
  </div>
 );
 }
}

refs例子--點擊獲取input焦點

class Example extends React.Component {
 handleClick() {
 // 使用原生的 DOM API 獲取焦點
 this.refs.myInput.focus
 ();
 }
 render() {
 // 當組件插入到 DOM 后,ref 屬性添加一個組件的引用于到 this.refs
 return (
  <div>
  <input type="text" ref="myInput" />
  <input
   type="button"
   value="點我輸入框獲取焦點"
   onClick={this.handleClick.bind(this)}
  />
  </div>
 );
 }
}

使用React.createRef()

React.createRef()React 16.3中引入的API。如果您使用的是早期版本的React,我們建議您使用回調(diào)引用。

創(chuàng)建React.createRef()

Refs是使用屬性創(chuàng)建的,React.createRef()并通過ref屬性附加到React元素。在構造組件時,通常將Refs分配給實例屬性,以便可以在整個組件中引用它們。

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

訪問ref

當ref被傳遞給元素時render,對該節(jié)點的引用變得可以在currentref 的屬性處訪問

const node = this.myRef.current;

ref的值根據(jù)節(jié)點的類型而有所不同

  • 當在refHTML元素上使用該屬性時,ref在構造函數(shù)中創(chuàng)建的屬性將React.createRef()接收底層DOM元素作為其current屬性。
  • 在ref自定義類組件上使用該屬性時,該ref對象將接收組件的已安裝實例作為其current。

您可能無法ref在函數(shù)組件上使用該屬性,因為它們沒有實例。

class CustomTextInput extends React.Component {
 constructor(props) {
 super(props);
 // create a ref to store the textInput DOM element
 this.textInput = React.createRef();
 this.focusTextInput = this.focusTextInput.bind(this);
 }

 focusTextInput() {
 // Explicitly focus the text input using the raw DOM API
 // Note: we're accessing "current" to get the DOM node
 this.textInput.current.focus();
 }

 render() {
 // tell React that we want to associate the <input> ref
 // with the `textInput` that we created in the constructor
 return (
  <div>
  <input
   type="text"
   ref={this.textInput} />

  <input
   type="button"
   value="Focus the text input"
   onClick={this.focusTextInput}
  />
  </div>
 );
 }
}

current當組件安裝時,React將為該屬性分配DOM元素,并null在卸載時將其分配回。ref更新發(fā)生之前componentDidMount或componentDidUpdate生命周期方法。

無法在函數(shù)組件上使用ref屬性

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

class Parent extends React.Component {
 constructor(props) {
 super(props);
 this.textInput = React.createRef();
 }
 render() {
 // This will *not* work!
 return (
  <MyFunctionComponent ref={this.textInput} />
 );
 }
}

**如果需要引用它,則應該將組件轉換為類,就像您需要生命周期方法或狀態(tài)時一樣。
但是,只要引用DOM元素或類組件,就可以在函數(shù)組件中使用該ref屬性:**

function CustomTextInput(props) {
 // textInput must be declared here so the ref can refer to it
 let textInput = React.createRef();

 function handleClick() {
 textInput.current.focus();
 }

 return (
 <div>
  <input
  type="text"
  ref={textInput} />

  <input
  type="button"
  value="Focus the text input"
  onClick={handleClick}
  />
 </div>
 );
}

將DOM引用公開給父組件

在極少數(shù)情況下,可能希望從父組件訪問子節(jié)點的DOM節(jié)點。通常不建議這樣做,因為它會破壞組件封裝,但它偶爾可用于觸發(fā)焦點或測量子DOM節(jié)點的大小或位置。

雖然可以向子組件添加引用,但這不是一個理想的解決方案,因為只能獲得組件實例而不是DOM節(jié)點。此外,這不適用于功能組件。

如果使用React 16.3或更高版本,我們建議在這些情況下使用ref forwarding。引用轉發(fā)允許組件選擇將任何子組件的引用公開為自己的組件??梢栽趓ef轉發(fā)文檔中找到有關如何將子DOM節(jié)點公開給父組件的詳細示例。

如果您使用React 16.2或更低版本,或者您需要比ref轉發(fā)提供的更多靈活性,您可以使用此替代方法并明確地將ref作為不同名稱的prop傳遞。

如果可能,建議不要暴露DOM節(jié)點,但它可以是一個有用的逃生艙。請注意,此方法要求向子組件添加一些代碼。如果您完全無法控制子組件實現(xiàn),則最后一個選項是使用findDOMNode(),但不鼓勵使用它StrictMode。

看完上述內(nèi)容,是不是對如何使用React中的Ref有進一步的了解,如果還想學習更多內(nèi)容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI