在 React.js 當中你基本不須要和 DOM 直接打交道。React.js 提供了一系列的 on*
方法幫助咱們進行事件監聽,因此 React.js 當中不須要直接調用 addEventListener
的 DOM API;之前咱們經過手動 DOM 操做進行頁面更新(例如藉助 jQuery),而在 React.js 當中能夠直接經過 setState
的方式從新渲染組件,渲染的時候能夠把新的 props
傳遞給子組件,從而達到頁面更新的效果。javascript
React.js 這種從新渲染的機制幫助咱們免除了絕大部分的 DOM 更新操做,也讓相似於 jQuery 這種以封裝 DOM 操做爲主的第三方的庫從咱們的開發工具鏈中刪除。java
可是 React.js 並不能徹底知足全部 DOM 操做需求,有些時候咱們仍是須要和 DOM 打交道。好比說你想進入頁面之後自動 focus 到某個輸入框,你須要調用 input.focus()
的 DOM API,好比說你想動態獲取某個 DOM 元素的尺寸來作後續的動畫,等等。react
React.js 當中提供了 ref
屬性來幫助咱們獲取已經掛載的元素的 DOM 節點,你能夠給某個 JSX 元素加上 ref
屬性:less
class AutoFocusInput extends Component { componentDidMount () { this.input.focus() } render () { return ( <input ref={(input) => this.input = input} /> ) } } ReactDOM.render( <AutoFocusInput />, document.getElementById('root') )
能夠看到咱們給 input
元素加了一個 ref
屬性,這個屬性值是一個函數。當 input
元素在頁面上掛載完成之後,React.js 就會調用這個函數,而且把這個掛載之後的 DOM 節點傳給這個函數。在函數中咱們把這個 DOM 元素設置爲組件實例的一個屬性,這樣之後咱們就能夠經過 this.input
獲取到這個 DOM 元素。函數
而後咱們就能夠在 componentDidMount
中使用這個 DOM 元素,而且調用 this.input.focus()
的 DOM API。總體就達到了頁面加載完成就自動 focus 到輸入框的功能(你們能夠注意到咱們用上了 componentDidMount
這個組件生命週期)。工具
咱們能夠給任意表明 HTML 元素標籤加上 ref
從而獲取到它 DOM 元素而後調用 DOM API。可是記住一個原則:能不用 ref
就不用。特別是要避免用 ref
來作 React.js 原本就能夠幫助你作到的頁面自動更新的操做和事件監聽。多餘的 DOM 操做實際上是代碼裏面的「噪音」,不利於咱們理解和維護。學習
順帶一提的是,其實能夠給組件標籤也加上 ref
,例如:開發工具
<Clock ref={(clock) => this.clock = clock} />
這樣你獲取到的是這個 Clock
組件在 React.js 內部初始化的實例。但這並非什麼經常使用的作法,並且也並不建議這麼作,因此這裏就簡單說起,有興趣的朋友能夠本身學習探索。動畫
由於第三方評論工具備問題,對本章節有任何疑問的朋友能夠移步到 React.js 小書的論壇 發帖,我會回答你們的疑問。this