七.獲取真實的DOM節點

組件並非真實的DOM節點。而是存在於內存之中的數據結構。叫作虛擬DOM(virtual DOM). 只有當它插入文檔後,纔會變成真實的DOM。html

根據React的設計。全部的DOM變更。都先在虛擬DOM下發生。而後在將實際發生變更的部分,反應在真實DOM上。這種算法叫DOMdiff.他能夠極大的提升網頁的性能表現。react

可是有時須要從組件獲取真實 DOM 節點。這時要用到ref屬性。算法

<!DOCTYPE html>
<html>
  <head>
    <script src="js/react.js"></script>
    <script src="js/react-dom.js"></script>
    <script src="js/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">

      var MyComponent = React.createClass({
        handleClick:function(){
          this.refs.myTextInput.focus();
        },

        render:function(){
          return (
            <div>
              <input type="text" ref="myTextInput" />
              <input type="button" value="Focus the text input" onClick={this.handleClick} />
            </div>
            )
        }
      })

      ReactDOM.render(
        <MyComponent />,
        document.getElementById("example")
        )
    </script>
  </body>
</html>babel

上面代碼中 組件MyComponent 的子節點有個文本輸入框,用於獲取用戶的輸入。數據結構

這時就必須獲取真實的DOM節點。虛擬節點是拿不到用戶輸入的。dom

爲了作到這一點,文本輸入框必須有個ref 屬性。而後 this.refs[refName]就會返回這個真實DOM節點。函數

須要注意的是。因爲 this.refs[refName]獲取的是真實的DOM節點。因此必須等到虛擬DOM插入文檔之後,才能使用這個屬性,不然會報錯。性能

上面代碼中。經過爲組件指定 Click事件的回調函數。確保了只有等到真實DOM發生Click事件以後纔會讀取this.refs[refName]屬性this

相關文章
相關標籤/搜索