欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React組件refs的使用詳解

 更新時間:2018年02月09日 16:44:01   作者:ABangBlog  
這篇文章主要介紹了React組件refs的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

ref顧名思義我們知道,其實它就可以被看座是一個組件的參考,也可以說是一個標識。作為組件的屬性,其屬性值可以是一個字符串也可以是一個函數(shù)。

其實,ref的使用不是必須的。即使是在其適用的場景中也不是非用不可的,因為使用ref實現(xiàn)的功能同樣可以轉(zhuǎn)化成其他的方法來實現(xiàn)。但是,既然ref有其適用的場景,那也就是說ref自有其優(yōu)勢。關(guān)于這一點和ref的適用場景,官方文檔中是這樣說的:

在從 render 方法中返回 UI 結(jié)構(gòu)之后,你可能想沖出 React 虛擬 DOM 的限制,在 render 返回的組件實例上調(diào)用某些方法。通常來說,這樣做對于應(yīng)用中的數(shù)據(jù)流動是不必要的,因為活躍的數(shù)據(jù)( Reactive data )流總是確保最新的 props 被傳遞到每一個從 render() 輸出的子級中去。然而,仍然有幾個場景使用這種方式是必須的,或者說是有益的:查找渲染出的組件的DOM標記(可以認為是DOM的標識ID),在一個大型的非React應(yīng)用中使用React組件或者是將你現(xiàn)有的代碼轉(zhuǎn)化成React。

下面我們來看這樣的一個場景(下面的例子經(jīng)常被用于ref的講解,可見下面描述的場景應(yīng)該是比較經(jīng)典的):通過某個事件使<input />元素的值被設(shè)為空字符串,然后使該<input />元素獲得焦點。

var App = React.createClass({
  getInitialState: function() {
   return {userInput: ''};
  },
  handleChange: function(e) {
   this.setState({userInput: e.target.value});
  },
  clearAndFocusInput: function() {
   this.setState({userInput: ''}); // 設(shè)置值為空字符串
        //這里想要實現(xiàn)獲得焦點   
  },
  render: function() {
   return (
    <div>
     <input
      value={this.state.userInput}
      onChange={this.handleChange}
     />
          <input type="button"
           value="Reset And Focus"
           onClick={this.clearAndFocusInput}
        />
    </div>
   );
  }
 });

在上面例子中,我們已經(jīng)實現(xiàn)了點擊按鈕通知input元素將值設(shè)為空字符串,但是還沒有實現(xiàn)使input元素獲得焦點。這實現(xiàn)起來有些困難,因為在render()中返回的并不是實際的子組件的組合,僅僅是一個特定時間特定實例的描述。這句話感覺挺繞的,其實render返回的是虛擬的DOM,并不是真實的DOM。因此我們不需要僅僅著眼于那些從render()中返回的那些組件。

那說到這,對于我們?nèi)绾螌崿F(xiàn)獲得焦點并沒有太大的幫助。要想實現(xiàn)獲得焦點這個功能我們需要借助ref來實現(xiàn)。上面我們提到過ref的值有兩種類型,一種是字符串、一種是回調(diào)函數(shù)。

ref字符串上屬性

React支持一個特殊的屬性,你可以將這個屬性加在任何通過render()返回的組件中。這也就是說對render()返回的組件進行一個標記,可以方便的定位的這個組件實例。這就是ref的作用。

ref的形式如下

<input ref="myInput" />

要想訪問這個實例,可以通過this.refs來訪問:

this.refs.myInput

先前版本中,我們可以通過React.findDOMNode(this.refs.myInput)來訪問組件的DOM。但是現(xiàn)在,已經(jīng)放棄了findDOMNode函數(shù)了,可以直接使用this.refs.myInput來進行訪問。

ref回調(diào)函數(shù)

ref屬性也可以是一個回調(diào)函數(shù)而不是一個名字。   這個函數(shù)將要在組件被掛載之后立即執(zhí)行。這個參照的組件將會作為該函數(shù)的參數(shù),這個函數(shù)可以立即使用這個組件參數(shù),當(dāng)然也可以將其保存供以后使用。

其形式也比較簡單:

render: function() {
  return <TextInput ref={(c) => this._input = c} } />;
},
componentDidMount: function() {
  this._input.focus();
},

或者是

render: function() {
  return (
   <TextInput
    ref={function(input) {
     if (input != null) {
      input.focus();
     }
    }} />
  );
},

這里需要注意,當(dāng)這個參照組件被卸載并且這個ref改變的時候,先前的ref的參數(shù)值將為null。這將有效的防止了內(nèi)存的泄露。所以在上面代碼中會有if判斷:

if(input != null){
     input.focus();
}

上面介紹了ref的使用場景和方法,下面我們就將上面的例子來補充完整,從而實現(xiàn)獲得焦點的功能

var App = React.createClass({
  getInitialState: function() {
    return {userInput: ''};
  },
  handleChange: function(e) {
    this.setState({userInput: e.target.value});
  },
  clearAndFocusInput: function() {
    this.setState({userInput: ''}); // Clear the input
    // We wish to focus the <input /> now!
    if (this.refs.myTextInput !== null) {
      this.refs.myTextInput.focus();
    }
  },
  render: function() {
    return (
      <div>
        <input
          value={this.state.userInput}
          onChange={this.handleChange}
          ref=”myTextInput”   
                     />
        <input
          type="button"
          value="Reset And Focus"
          onClick={this.clearAndFocusInput}
          />
      </div>
    );
  }
});
ReactDOM.render(
  <App />,
  document.getElementById('content')
);

在這個例子中, render 函數(shù)返回一個 <input /> 實例的描述。但是真正的實例通過 this.refs. myTextInput獲取。只要 render 返回的某個子組件帶有 ref="myTextInput" ,this.refs. myTextInput就會獲取到正確的實例。

上面就是ref的所有內(nèi)容,更多關(guān)于ref的介紹可以參考Ref to Components。

對于ref我們就介紹到這,希望本文對大家有所幫助。也希望大家多多支持腳本之家。

相關(guān)文章

  • Ant Design組件庫的使用教程

    Ant Design組件庫的使用教程

    AntDesign ,簡稱antd是基于 Ant Design 設(shè)計體系的 React UI 組件庫,主要用于研發(fā)企業(yè)級中后臺產(chǎn)品,這篇文章主要介紹了Ant Design組件庫的使用教程,需要的朋友可以參考下
    2023-12-12
  • React通過useContext特性實現(xiàn)組件數(shù)據(jù)傳遞

    React通過useContext特性實現(xiàn)組件數(shù)據(jù)傳遞

    本文主要介紹了React如何通過useContext特性實現(xiàn)組件數(shù)據(jù)傳遞,文中有相關(guān)的代碼示例供大家參考,對我們學(xué)習(xí)React有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • 詳細聊聊React源碼中的位運算技巧

    詳細聊聊React源碼中的位運算技巧

    眾所周知在React中,主要用到3種位運算符 —— 按位與、按位或、按位非,下面這篇文章主要給大家介紹了關(guān)于React源碼中的位運算技巧的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 詳解如何使用Jest測試React組件

    詳解如何使用Jest測試React組件

    在本文中,我們將了解如何使用Jest(Facebook 維護的一個測試框架)來測試我們的React組件,我們將首先了解如何在純 JavaScript 函數(shù)上使用 Jest,然后再了解它提供的一些開箱即用的功能,這些功能專門用于使測試 React 應(yīng)用程序變得更容易,需要的朋友可以參考下
    2023-10-10
  • React國際化react-i18next詳解

    React國際化react-i18next詳解

    react-i18next 是基于 i18next 的一款強大的國際化框架,可以用于 react 和 react-native 應(yīng)用,是目前非常主流的國際化解決方案。這篇文章主要介紹了React國際化react-i18next的相關(guān)知識,需要的朋友可以參考下
    2021-10-10
  • 使用React-Router時出現(xiàn)的錯誤及解決

    使用React-Router時出現(xiàn)的錯誤及解決

    這篇文章主要介紹了使用React-Router時出現(xiàn)的錯誤及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 基于React路由跳轉(zhuǎn)的幾種方式

    基于React路由跳轉(zhuǎn)的幾種方式

    這篇文章主要介紹了React路由跳轉(zhuǎn)的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 重新理解?React?useRef原理

    重新理解?React?useRef原理

    這篇文章主要為大家介紹了React?useRef原理的深入理解分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • React?保留和重置State

    React?保留和重置State

    這篇文章主要為大家介紹了React?保留和重置State實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • react如何利用useRef、forwardRef、useImperativeHandle獲取并處理dom

    react如何利用useRef、forwardRef、useImperativeHandle獲取并處理dom

    這篇文章主要介紹了react如何利用useRef、forwardRef、useImperativeHandle獲取并處理dom,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10

最新評論