之前我們曾說到,我們可以 useState 配合 on..
系列的事件去綁定 DOM,讓我們可以達成我們要的事件,但是若是發生以下狀況我們該如何去解決呢?
現在讓我們做出一個 input
標籤,並且取得他的值,印在畫面上,現在我們可能會這樣做
import { useState } from "react";
const Text = () => {
const [text, setText] = useState("");
const CountText = (e) => {
setText(e)
console.log("re-render");
}
return (
<div>
<input type="text" onChange={(e)=>{CountText(e.target.value)}}/>
<div>
目前文字: {text}
</div>
</div>
)
}
export { Text }
雖然我們可以抓到他每次改變的值
但是對 React 已經有一些清楚的你應該知道會發生什麼事吧
那就是每當 input
的值改變時,畫面就會重新 re-render 了
若是小專案的話,勉強可以接受,但是我們可能會遇到大型的專案,每次的 re-render 都是很大的消耗,而且 React 有提供更方便的 Hook 讓我們不會發生這種問題,現在讓我們來隆重介紹今日的主角 useRef
useRef 是一個函式
跟 useState
的相同之處接收一個參數,作為初始值
而不同的地方是 useState
會回傳一個包含兩個值的陣列,第一個值是 state
、第二個值setState
是用來更新 state 的函式。
而且每當 renderCount 值改變,就會觸發 re-render
差別是useRef
回傳的是一個物件,裡面只有一個屬性current
,
重點是,請大家拿起筆記,這邊是重點
就是 當更新 current 值並不會觸發 re-render
看到不會 re-render 大家應該都很興奮吧!
接下來讓我們用簡單的範例來說明 useRef
const count = useRef(0);
count = { current: 0 }
import { useState, useRef } from "react";
const Text = () => {
const [text, setText] = useState("");
const textRef = useRef("")
const textHandler = () => {
console.log(textRef.current);
setText(textRef.current.value)
}
const inputFocus = () => {
textRef.current.focus()
}
return (
<div>
<input type="text" ref={textRef} />
<div>
目前文字: {text}
</div>
<button onClick={inputFocus}>按此可以進行輸入</button>
<button onClick={textHandler}>送出文字</button>
</div>
)
}
export { Text }
我們只要在 input
標籤上加上 ref
屬性並且給他你定義的 useRef
變數,就可以了,是不是很簡單
注意! 我們可以加上下面這句來確認 textRef.current
到底是什麼!
console.log(textRef.current);
印出來的結果是這樣
所以我們就可以取得 input
的值也就是textRef.current.value
,來達到我們的目的~
今天介紹了 useRef 的基本用法,明天會再繼續下去,讓我們看看 useRef 還有什麼黑魔法,謝謝大家