useRef
在工做中雖然用的很少,可是也不能缺乏。它有兩個主要的做用:javascript
用useRef
獲取React JSX中的DOM元素,獲取後你就能夠控制DOM的任何東西了。可是通常不建議這樣來做,React界面的變化能夠經過狀態來控制。html
用useRef
來保存變量,這個在工做中也不多能用到,咱們有了useContext
這樣的保存其實意義不大,可是這是學習,也要把這個特性講一下。java
界面上有一個文本框,在文本框的旁邊有一個按鈕,當咱們點擊按鈕時,在控制檯打印出input
的DOM元素,並進行復制到DOM中的value上。這一切都是經過useRef
來實現。react
在/src
文件夾下新建一個Example8.js
文件,而後先引入useRef,編寫業務邏輯代碼以下:瀏覽器
import React, { useRef} from 'react'; function Example8(){ const inputEl = useRef(null) const onButtonClick=()=>{ inputEl.current.value="Hello ,JSPang" console.log(inputEl) //輸出獲取到的DOM節點 } return ( <> {/*保存input的ref到inputEl */} <input ref={inputEl} type="text"/> <button onClick = {onButtonClick}>在input上展現文字</button> </> ) } export default Example8
當點擊按鈕時,你能夠看到在瀏覽器中的控制檯完整的打印出了DOM的全部東西,而且界面上的<input/>
框的value值也輸出了咱們寫好的Hello ,JSPang
。這一切說明咱們可使用useRef獲取DOM元素,而且能夠經過useRefu控制DOM的屬性和值。dom
這個操做在實際開發中用的並很少,但咱們仍是要講解一下。就是useRef
能夠保存React中的變量。咱們這裏就寫一個文本框,文本框用來改變text
狀態。又用useRef
把text
狀態進行保存,最後打印在控制檯上。寫這段代碼你會覺的很繞,其實顯示開發中不必這樣寫,用一個state狀態就能夠搞定,這裏只是爲了展現知識點。jsp
接着上面的代碼來寫,就不必從新寫一個文件了。先用useState
聲明瞭一個text
狀態和setText
函數。而後編寫界面,界面就是一個文本框。而後輸入的時候不斷變化。函數
import React, { useRef ,useState,useEffect } from 'react'; function Example8(){ const inputEl = useRef(null) const onButtonClick=()=>{ inputEl.current.value="Hello ,useRef" console.log(inputEl) } const [text, setText] = useState('jspang') return ( <> {/*保存input的ref到inputEl */} <input ref={inputEl} type="text"/> <button onClick = {onButtonClick}>在input上展現文字</button> <br/> <br/> <input value={text} onChange={(e)=>{setText(e.target.value)}} /> </> ) } export default Example8
這時想每次text
發生狀態改變,保存到一個變量中或者說是useRef
中,這時候就可使用useRef
了。先聲明一個textRef
變量,他其實就是useRef
函數。而後使用useEffect
函數實現每次狀態變化都進行變量修改,並打印。最後的所有代碼以下。post
import React, { useRef ,useState,useEffect } from 'react'; function Example8(){ const inputEl = useRef(null) const onButtonClick=()=>{ inputEl.current.value="Hello ,useRef" console.log(inputEl) } //-----------關鍵代碼--------start const [text, setText] = useState('jspang') const textRef = useRef() useEffect(()=>{ textRef.current = text; console.log('textRef.current:', textRef.current) }) //----------關鍵代碼--------------end return ( <> {/*保存input的ref到inputEl */} <input ref={inputEl} type="text"/> <button onClick = {onButtonClick}>在input上展現文字</button> <br/> <br/> <input value={text} onChange={(e)=>{setText(e.target.value)}} /> </> ) } export default Example8
這時候就能夠實現每次狀態修改,同時保存到useRef
中了。也就是咱們說的保存變量的功能。那useRef
的主要功能就是得到DOM和變量保存,咱們都已經講過了。你的編碼能力有增長了一些,讓咱們一塊兒加油。學習
轉自:https://jspang.com/posts/2019/08/12/react-hooks.html