今天來畫 React Hook Form 表單魔法陣吧!!先來看安裝方法以及一個簡單的範例:
招喚表單魔法陣第一步:在 VS code 打開專案,打開終端機,輸入安裝指令,並在專案中導入
npm install react-hook-form
import { useForm } from "react-hook-form"
招喚表單魔法陣第二步:建立表單架構~
import { useForm } from "react-hook-form"
export default function Form () {
return (
<form>
<label>名字</label>
<input />
<label>性別</label>
<select>
<option value="M">男</option>
<option value="F">女</option>
<option value="OTHER">其他</option>
</select>
<label>Email</label>
<input />
<input type="submit" />
</form>
)
}
招喚表單魔法陣第三步:使用 useForm() 來建立具驗證功能的表單。
import { useForm } from "react-hook-form"
export default function Form() {
// 使用 useForm 來管理表單的狀態,register 註冊輸入框,handleSubmit 處理表單提交,
// errors 管理表單錯誤信息
const { register, handleSubmit, formState: { errors } } = useForm()
// 當表單通過驗證後,會觸發 onSubmit 函式,並將表單數據作為參數傳入,通常會在這裡串接API
const onSubmit = (data) => console.log(data)
return (
{/* 當表單提交時,handleSubmit 會先驗證表單,如果驗證通過,則執行 onSubmit */}
<form onSubmit={handleSubmit(onSubmit)}>
<label>名字</label>
{/* register 方法將這個輸入框註冊到表單中,並附加必填驗證規則 */}
<input {...register("name", { required: "請輸入名字" })} />
{/* 如果名字欄位有錯誤,顯示錯誤信息 */}
{errors.name && ( <div>{errors.name.message}</div>)}
<label>性別</label>
{/* 性別下拉框,register 會驗證此欄位是否已被選擇 */}
<select {...register("gender", { required: "請選擇性別" })}>
<option value="M">男</option>
<option value="F">女</option>
<option value="OTHER">其他</option>
</select>
{/* 如果性別欄位有錯誤,顯示錯誤信息 */}
{errors.gender && (<div>{errors.gender.message}</div>)}
<label>Email</label>
{/* register 方法註冊 Email 欄位,並附加必填和格式驗證規則 */}
<input
{...register("email", {
required: "請輸入電子信箱", // 必填驗證
pattern: {
value:
/^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-
z]+$/, // 電子郵件格式驗證
message: "請輸入正確的電子信箱", // 如果格式錯誤,顯示此訊息
},
})}
/>
{/* 如果性別欄位有錯誤,顯示錯誤信息 */}
{errors.email && ( <div>{errors.email.message}</div>)}
<input type="submit" />
</form>
)
}
以上大約可以知道 React Hook Form 的使用方法,接下來再詳細介紹一下 useForm ,這是套件的核心,當我們呼叫 useForm,會得到一個物件,裡面包含很多方法與狀態,主要可以分成 三大類:註冊 (register)、操作 (methods)、狀態 (state)。
<input {...register("name", { required: "請輸入名字" })} />
handleSubmit(onValid, onInvalid?):包裹在 form 標籤上的 onSubmit 中。
watch(name?, defaultValue?):監聽輸入值變化,回傳當前值。沒帶參數時會監聽整份表單。
setValue(name, value, options?):手動設定欄位值。
getValues(name?):取得目前表單的值。
reset(values?, options?):重設表單 (回到初始值或指定值)。
resetField(name, options?):重設單一欄位。
trigger(name?, options?):觸發驗證 (單一欄位或整份表單)。
另外在呼叫 useForm 的時候也能設置表單初始值、表單驗證時機以及與其他驗證套件整合:
const { register, handleSubmit, formState: { errors } } = useForm({
defaultValues: {
name: '',
gender: null,
email: '',
},
mode: "onChange",//表單驗證時機,其餘包含 onBlur | onSubmit | onTouched | all
resolver: yupResolver(schema),//整合其他表單驗證套件
})
今天先大致停在這裡,明天再來補充 React Hook Form 如何與其他的元件庫、驗證套件做整合,不得不說,前端的表單要寫得好,搭配好的套件工具可以事半功倍啊啊啊啊啊><