再來一個。
懶人包
以下是幾個很重要的特性:
- 回傳值是一個有 current 屬性的 Object
- 更新 current 值不會觸發 re-render
- re-render 的時後不會被重新賦值
這些是我覺得最重要的幾點,請務必弄清楚。
用來存取 Uncontrolled Component
通常是用在 Uncontrolled Component(沒有 state 的 Component) 上,不過這邊為了方便會直接拿 <input>
來舉例(實務上通常會把 <input>
當成 controlled Component):
1 | import { useRef } from 'react' |
一開始的 inputRef
應該會是一個空物件 {current: null}
(我猜的啦),接著當你把它當作 props 給 Component 的時候就會被變成那個 DOM 元素。
所以你才能在其他 function 中透過 inputRef
來抓到對應的 DOM 元素。
不希望 re-render 後被重新賦值
有時候沒注意好的話可能就會犯這種錯:
1 | function App () { |
這邊碰到的問題是怎麼 id++
沒用?
原來是因為每次 re-render 的時候又會執行到 let id = 1
這段,這樣就等於又重新賦值了,所以結果還是會顯示 1,而不是遞增後的值。
要解決這個問題有兩種做法,一種是把 let id = 1
宣告在 Component 的外面,這樣 re-render 時就不會重新宣告一次。
另一種作法是用 useRef
來處理:
1 | function App () { |
雖然 re-render 的時候看起來好像會再執行一次 const id = useRef(1)
,不過 useRef
的特性就是會把值給保留起來,所以實際上是不會被重新賦值的。
只有像 id.current++
這種「自己去改變數值」的情況下它的值才會改變。
所以 useRef
就有點像是 useEffect
的顛倒過來。一個不能直接改值,一個可以;而一個在改值後會 re-render, 一個不會。