--- tags: 2022 React 新手讀書會 --- # 🏅 Day 17 |React Hook Form - email, password 昨天我們已經練習了如何使用 React Hook Form,今日則進階來設定多重的驗證條件。在實務上我們常會遇到像是帳號或密碼的 input,除了是『必填欄位』以外,可能還會需要驗證輸入是否符合格式,像是 email 格式,或是密碼需符合 8 碼以上包含大小寫字母、數字等等的條件限制。 在 React Hook Form 中有提供各種驗證屬性,如下: - required: 必填 - min: 輸入的最小值,例如:年齡必須輸入 0 以上。 - max: 輸入的最大值,例如:年齡必須輸入 120 以下。 - minLength: 輸入的字串長度最小值,例如:密碼需大於 8 碼。 - maxLength: 輸入的字串長度最大值,例如:標題需小於 12 字。 - pattern:可以使用 regex 正規表達式來客製化自己的輸入限制。 - validate:加入 callback function 執行自訂的驗證函式。 [Applyvalidation 文件](https://react-hook-form.com/get-started#Applyvalidation) 當有兩個以上的屬性需要驗證,我們可以這麼寫: ```jsx= {/* 如昨天的寫法一*/} <input {...register("account", { required: true, pattern: /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g })} /> {errors.account && errors.account.type === "required" && <span>此欄位必填</span>} {errors.account && errors.account.type === "pattern" && <span>不符合 Email 規則</span> } ``` 這邊定義了 `required` 和 `pattern` 兩個驗證,`pattern` 的正規表達式是限制了 mail 輸入格式,所以當兩者有其中一個不符合時,就可以根據 type 顯示對應的錯誤。 到這邊應該有同學覺得這麼寫不夠漂亮,因為每定義一個驗證,我們就需要寫一次 error 訊息。因此也提供另一種寫法給大家參考: ```jsx= {/* 如昨天的寫法三 */} <input type="number" {...register("age", { required: {value : true, message: "此欄位必填"}, min: {value: 0, message: "請輸入大於 0 的數字"} })} /> {errors.age?.message} ``` 小提醒:因為像是 `pattern`、 `minLength` 等等的驗證屬性,都需要設定 value,所以就無法用昨天的寫法二,直接將 message 寫在屬性值的方式哦 ## 題目 請複製 (右下角 fork)這個[範例](https://codepen.io/hexschool/pen/JjLNEOZ),並試著完成題目需求。 - 提供兩個 input 分別是可以輸入帳號和密碼。 - 點選『提交』按鈕,則會驗證欄位輸入是否符合條件,否則顯示對應錯誤訊息。 條件設定與對應的錯誤訊息說明如下: - 帳號: - 必填 (required):此欄位必填。 - 格式 (pattern):不符合 Email 規則 - 密碼: - 必填 (required):此欄位必填。 - 輸入長度(minLength): 密碼至少為 8 碼。 ## 回報流程 將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: ``` 解法一: <div> <label>email: </label> <input {...register("account", { required: true, pattern: /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g })} /> {errors.account && errors.account.type === "required" && <span>此欄位必填</span>} {errors.account && errors.account.type === "pattern" && <span>不符合 Email 規則</span> } </div> <div> <label>password: </label> <input {...register("password", { required: true, minLength: 8 })} /> {errors.password && errors.password.type === "required" && <span>此欄位必填</span>} {errors.password && errors.password.type === "minLength" && <span>密碼至少為 8 碼</span> } </div> 解法二: <div> <label>email: </label> <input {...register("account", { required: {value : true, message: "此欄位必填"}, pattern: {value: /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g, message: "不符合 Email 規則"} })} /> {errors.account?.message} </div> <div> <label>password: </label> <input {...register("password", { required: {value : true, message: "此欄位必填"}, minLength: {value: 8, message: "密碼至少為 8 碼"} })} /> {errors.password?.message} </div> ``` --> 回報區 --- | Discord | CodePen / 答案 | |:--------------:|:-------------------------------------------------------------------:| | Rice#8043 | [CodePen](https://codepen.io/riecball/pen/KKoByxM?editors=1011) | | yunyun#5215 | [CodePen](https://codepen.io/yun_yunni/pen/ExEMdOo) | | 布魯諾#7239 | [CodePen](https://codepen.io/bruno-yu/pen/yLKwRwg?editors=0010) | | Vita Ora#4585 | [CodePen](https://codepen.io/showlovezz/pen/abYMRXq?editors=0010) | | HedgehogKU | [CodePen](https://codepen.io/hedgehogkucc/pen/LYdagwg?editors=1010) | | ChloeLo#4858 | [CodePen](https://codepen.io/chloelo/pen/mdxoQwy) | | JC#8658 | [Codepen](https://codepen.io/jcsamoyed/pen/XWEGyZP) | | 彼得#1923 | [Codepen](https://codepen.io/shiou-ho/pen/BarbGGW) | | Ayre#0016 | [Codepen](https://codepen.io/yichunlin09/pen/yLKwQjK?editors=0010) | | 無名#6427 | [Codepen](https://codepen.io/Nomoney/pen/ZExPmgm?editors=0010) | | hiYifang #0736 | [Codepen](https://codepen.io/hiYifang/pen/WNzmLbz) | | wenyun#2362 | [Codepen](https://codepen.io/wenyuncc/pen/vYRPQvL?editors=0010) | | 威爾#1694 | [CodePen](https://codepen.io/WILL_Wu/pen/NWYJEQX) | | yuyu#6310 | [CodePen](https://codepen.io/yuyu0905/pen/oNqVJBx?editors=0110) | | SHIN#6075 | [CodePen](https://codepen.io/shin9626/pen/mdxoaMM) | | CofCat#9226 | [CodePen](https://codepen.io/cofcat456/pen/WNzmPXN?editors=1010) | | rainbow#3329 | [CodePen](https://codepen.io/g901612002/pen/BarbMrg?editors=1010) | | Chelly#6129 | [CodePen](https://codepen.io/chellyhsu/pen/dymrwzO) | | Mitour#0672 | [CodePen](https://codepen.io/mitour/pen/KKoEJyd) | | aki | [codepen](https://codepen.io/aki168/pen/rNdRPMM)| | Wu#0167 | [codepen](https://codepen.io/Xander0705/pen/poLYGqE)| |Evonne#7078|[codepen](https://codepen.io/Hsu1Fang/pen/PoRLVOL?editors=0011)| |VadaChen#2055|[CodePen](https://codepen.io/vadachen/pen/GRxeejR?editors=0010)| |Eric Su#7798|[CodePen](https://codepen.io/wc-su/pen/wvmOYzZ)| |Kimi#2092|[CodePen](https://codepen.io/a3216lucy/pen/ExEMrpw)| | Dylan_Lin#7320 |[CodePen](https://codepen.io/lin-dylan/pen/abYMMPx?editors=0110)| | Mr.Sean#3825 |[CodePen](https://codepen.io/sean_1215/pen/MWVxLzJ?editors=0110)| | JarDar#6980 |[codepen](https://codepen.io/jardarpen/pen/KKoEYQJ)| |Yanyan#3555|[CodePen](https://codepen.io/wei-yi-lee/pen/abYMxEO?editors=1111)| |IreneLee#7932|[CodePen](https://codepen.io/ntjtcxpt-the-animator/pen/NWYJmme?editors=1010)| |Midnightdinner#6220|[Codepen](https://codepen.io/woowooyong/pen/VwXRJLR)| |Yiling#4054|[Codepen](https://codepen.io/lin010/pen/mdxoZEb?editors=1011)| |wiimax#4564| [Codepen](https://codepen.io/willismax/pen/GRxebwq) |Timothy#5863| [Codepen](https://codepen.io/timothy_hippo/pen/poLYXBV?editors=0010) |Robert Lo#9653| [Codepen](https://codepen.io/Robert-Lo/pen/JjLzQaV?editors=0110) |Otis#8455| [Codepen](https://codepen.io/humming74/pen/RwMObbQ?editors=1011)| |lingxuan|[CodePen](https://codepen.io/lingxuan0618/pen/MWVRWPG)| |Stanley#2505|[Codepen](https://codepen.io/bigbearada/pen/poLBvyO)| |easton#3863|[Codepen](https://codepen.io/EastonIsCodingNow/pen/rNdbVjL)| | 城堡#2126 | [CodePen](https://codepen.io/tthcastle/pen/QWmPbRN) | | Kenge#3690 | [CodePen](https://codepen.io/pgkusn/pen/MWVRaWm) | | Ryder#7398 | [CodePen](https://codepen.io/rider159159/pen/abYxvYQ) | | 薯餅#3581 | [CodePen](https://codepen.io/ColdingPoTaTo/pen/YzaMyMX) | | shin#5792 | [CodePen](https://codepen.io/hah1030/pen/eYMoJJx) | | rocker#6235 | [CodePen](https://codepen.io/RockerLi/pen/xxWeZLb) | | 翔#0859 | [CodePen](https://codepen.io/energy95272z/pen/VwXNeve?editors=0010) | | Anson#3594 | [CodePen](https://codepen.io/huanmingchang/pen/MWVRpjz) | | LinaChen#1796 | [CodePen](https://codepen.io/LinaChen/pen/GRxeYbV) | | IceSam#7836 | [CodePen](https://codepen.io/sam-hsu/pen/dymLRbg) | | Bumble幫啵#0255 | [CodePen](https://codepen.io/pen/WNzWOdR) | | 葉秋#2335 | [CodePen](https://codepen.io/as880074/pen/RwMOgBN?editors=1010) | | RON#2813 | [CodePen](https://codepen.io/Ron115/pen/yLKrPxp) | | Carolkiki2003#7399 | [CodePen](https://codepen.io/wasfzuig/pen/OJverpN) | | ZengZeng | [CodePen](https://codepen.io/tyzyoko/pen/oNqrmJW) | | Li-Ninja#0471 | [CodePen](https://codepen.io/li-ninja/pen/BarggvB?editors=0010) | | Jasonlu | [CodePen](https://codepen.io/wnptocip/pen/eYrOmQM?editors=1010) | |TedWang|[CodePen](https://codepen.io/wangtaiyan/pen/bGMbEqV?editors=0010)| |kancheng#3915|[CodePen](https://codepen.io/kancheng/pen/rNvBpwz?editors=1011)| |JimmyChang#5558|[CodePen](https://codepen.io/JimmyChangWenChi/pen/mdLdOqV?editors=1010)| |eching#9183|[CodePen](https://codepen.io/echin/pen/KKoLedJ)| |Eshiunm|[CodePen](https://codepen.io/Code-My/pen/abxQbVx)|