1. 程式人生 > >React元件refs詳解

React元件refs詳解

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

其實,ref的使用不是必須的。即使是在其適用的場景中也不是非用不可的,因為使用ref實現的功能同樣可以轉化成其他的方法來實現。但是,既然ref有其適用的場景,那也就是說ref自有其優勢。關於這一點和ref的適用場景,官方文件中是這樣說的:

在從 render 方法中返回 UI 結構之後,你可能想衝出 React 虛擬 DOM 的限制,在 render 返回的元件例項上呼叫某些方法。通常來說,這樣做對於應用中的資料流動是不必要的,因為活躍的資料( Reactive data )流總是確保最新的 props 被傳遞到每一個從 render() 輸出的子級中去。然而,仍然有幾個場景使用這種方式是必須的,或者說是有益的:查詢渲染出的元件的DOM標記(可以認為是DOM的標識ID),在一個大型的非React應用中使用React元件或者是將你現有的程式碼轉化成React

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

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

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

那說到這,對於我們如何實現獲得焦點並沒有太大的幫助。要想實現獲得焦點這個功能我們需要藉助ref來實現。上面我們提到過ref的值有兩種型別,一種是字串、一種是回撥函式。

ref字串上屬性

React支援一個特殊的屬性,你可以將這個屬性加在任何通過render

()返回的元件中。這也就是說對render()返回的元件進行一個標記,可以方便的定位的這個元件例項。這就是ref的作用。

ref的形式如下

<input ref="myInput" />

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

this.refs.myInput

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

ref回撥函式

ref屬性也可以是一個回撥函式而不是一個名字。   這個函式將要在元件被掛載之後立即執行。這個參照的元件將會作為該函式的引數,這個函式可以立即使用這個元件引數,當然也可以將其儲存供以後使用。

其形式也比較簡單:

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();
          }
        }} />
    );
},

這裡需要注意,當這個參照元件被解除安裝並且這個ref改變的時候,先前的ref的引數值將為null。這將有效的防止了記憶體的洩露。所以在上面程式碼中會有if判斷:

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

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

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 函式返回一個 <input /> 例項的描述。但是真正的例項通過 this.refs. myTextInput獲取。只要 render 返回的某個子元件帶有 ref="myTextInput" ,this.refs. myTextInput就會獲取到正確的例項。

上面就是ref的所有內容,更多關於ref的介紹可以參考Ref to Components

對於ref我們就介紹到這,希望本文對大家有所幫助。

原連結

相關推薦

React元件refs

ref顧名思義我們知道,其實它就可以被看座是一個元件的參考,也可以說是一個標識。作為元件的屬性,其屬性值可以是一個字串也可以是一個函式。 其實,ref的使用不是必須的。即使是在其適用的場景中也不是非用不可的,因為使用ref實現的功能同樣可以轉化成其他的方法來實現。但是,既然ref有其適用的場景,那也就是

R5-React元件通訊

ps:讓幾個好友看了前幾篇文章,提了幾個建議,主要就是說文章需要在提煉,需要精簡。 這一章介紹元件通訊,元件與元件之間如何傳遞資料。 概覽: 1.父子通訊 如圖,父子元件之間通訊:子元件可通過pro

React Refs

初心-楊瑞超個人部落格誠邀您加入qq群(IT-程式猿-技術交流群):757345416 React 支援一種非常特殊的屬性 Ref ,你可以用來繫結到 render() 輸出的任何元件上。這個特殊的屬性允許你引用 render() 返回的相應的支撐例項( backing i

React Native按鈕|Touchable系列元件使用

在做App開發過程中離不了的需要使用者互動,說到互動,我們首先會想到的就是按鈕了,在React Native中沒有專門的按鈕元件。 為了能讓檢視能夠響應用的的點選事件,我們需要藉助Touchablexxx元件,來包裹我們的檢視。為什麼說是Touchablexxx呢,因為它

spring cloud服務發現元件Eureka

  Eureka是Netflix開發的服務發現元件,本身是一個基於REST的服務。Spring Cloud將它整合在其子專案spring-cloud-netflix中,以實現Spring Cloud的服務發現功能。目前Eureka 專案相當活躍,程式碼更新相當頻繁,目前最新的版本是

Netty非同步非阻塞事件驅動及元件原理

本文基於 Netty 4.1 展開介紹相關理論模型,使用場景,基本元件、整體架構,知其然且知其所以然,希望給大家在實際開發實踐、學習開源專案方面提供參考。 Netty 是一個非同步事件驅動的網路應用程式框架,用於快速開發可維護的高效能協議伺服器和客戶端。 JDK 原生 NIO 程式的問題

Android架構元件WorkManager

       WorkManager架構元件是用來管理後臺工作任務。這個時候你可能會奇怪了Android不是已經 有很多管理後臺任務的類了麼,比如JobScheduler, AlarmManger、在比如AsyncTask, ThreadPool。Wo

react 高階函式(附送彩蛋)

此文適合react新手入門,react大佬可以略過(畢竟以前都是寫vue,React才寫了一個多月, 掩面淚奔) 主要是學習react中的一些經驗總結,如果你覺得對你有幫助,可以給個贊github。 react專案入門 react版本:16.0.0 (因為工作中還是15的版本) 首先我們先來說說 有

echarts-for-react的使用

Echarts-for-react的使用 示例 一、安裝 npm install --save echarts-for-react //如果需要使用echarts的一些特殊方法需要安裝 npm install --save echarts 二、使用 impo

react生命週期

React的生命週期分為三個階段:1.初始化階段 2.更新階段 3.銷燬階段 一,初始化階段 (1) 方法:getDefaultProps(); 作用:作用於元件類,只調用一次,獲取預設的props,也可以用dufaultProps設定元件的預設屬性; 注意: (2) 方法:

React Native佈局

一、Flexbox 佈局 Flex有兩個屬性:Container  和 Item flex是Flexible Box的縮寫,意為"彈性佈局",用來為盒狀模型提供最大的靈活性。採用flex佈局的元素,稱為flex容器(flex container),簡稱"容器"。它的所有子元素自動成為容器成員,稱為fl

在dom元素中使用refs

引用Refs提供了一個訪問render()方法DOM節點或者React元素的方法。 典型的React資料流中,props是雙親元件和子元件互動的唯一手段。要修改一個子元件,你需要使用新的props重新渲染它。然而,確實存在少數一些情況你需要命令性地(imperatively)修改一個子節點而不

04 - springMVC三大元件配置

springMVC三大元件配置 概述 1. springMVC預設載入元件 2.配置檔案解讀 3.配置檢視解析器 概述 上篇分析了springMVC的架構流程,這篇對三大元件的配

Android開發之基本控制元件四種佈局方式

Android中的控制元件的使用方式和iOS中控制元件的使用方式基本相同,都是事件驅動。給控制元件新增事件也有介面回撥和委託代理的方式。今天這篇部落格就總結一下Android中常用的基本控制元件以及佈局方式。說到佈局方式Android和iOS還是區別挺大的,在iOS中有F

Android開發的之基本控制元件四種佈局方式

Android中的控制元件的使用方式和iOS中控制元件的使用方式基本相同,都是事件驅動。給控制元件新增事件也有介面回撥和委託代理的方式。今天這篇部落格就總結一下Android中常用的基本控制元件以及佈局方式。說到佈局方式Android和iOS還是區別挺大的,在iOS中有Frame絕對佈局和AutoL

android開發之wheel控制元件使用

出門在外生不起病呀,隨便兩盒藥60多塊錢。好吧,不廢話了,今天我們來看看wheel控制元件的使用,這是GitHub上的一個開源控制元件,用起來十分方便,我們可以用它做許多事情,比如做一個自定義的datepicker,在一些電商App中,經常用它來做省市縣三級聯動,總之用途還是

React之key

React之key詳解 react.js   wonyun 4月21日釋出

日曆控制元件--MaterialCalendarView

專案中遇到了日曆選擇的模組,經過搜尋,發現了一個比較好用的日曆控制元件MaterialCalendarView 下面講講它的基本用法. 首先對他新增依賴 compile 'com.prolificinteractive:material-calenda

iOS控制元件——UITableView

iOS開發中經常會用到UITableView,我們平時使用的軟體中到處都可以看到它,比如微信、QQ、微博等軟體基本上隨處都是UITableView。最主要到還有iOS設定。 一  基本介紹 UITableView有兩種Style:UITableViewStylePlain和

React--key值

專案中遇到不少的坑,例如元件的key影響載入,或者警告陣列遍歷子元素要有一個唯一的key值等,今天彙總說一下: 參考部落格 1、key的作用 react中的key屬性,它是一個特殊的屬性,它是出現不是給開發者用的(例如你為一個元件設定key之後不能獲取元件