組件並非真實的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