iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
3
Modern Web

TypeScript + React + 雜七雜八系列 第 14

【Day 14】Formik,在 React 製作表單的利器

  • 分享至 

  • xImage
  •  

大家好,今天的篇章要介紹的是 Formik

會延續前一天的專案結構接續下去進行修改,如果沒有參與到昨天的建置過程,這邊也有提供原始碼
https://github.com/littlehorseboy/typescript-react/tree/day13-typescript-redux


Formik

就先上 code 再來說明

npm i formik
+ src/components/FormikPractice/FormikPractice.tsx

Formik 使用上就是用 <Formik> 包住 <form> 來幫你做好表單處理的事情,從上到下依序說明 <Formik> 使用的各個屬性

initialValues

初始值,要注意的是型別,設定了就會被自動定型了,可以就把它當成是一個 component 內的 state

後續在使用這個 values 時都會遵照這個型別來處理資料

validate

這是為了驗證 values 的內容所設的 function,有一串長的很特別的 { [key in keyof typeof values]?: string } 的型別,這是為了讓 errors 能遵照 initialValues 的 key 但是要改成都是 string 型別,最後 error 回傳一定要是 { } 空的物件,驗證才是真的通過

onSubmit

表單按下 submit 時,會將 isSubmitting 改為 true,然後驗證有通過,就會進入執行這段 function,actions 裡面也有很多妙用,這裡就是故意 setTimeout
0.5 秒後才將 isSubmitting 改為 false

內容

最上排提供了一堆解構出來了參數(常用的大概這些,不過還有 更多喔,曾用過 setFieldValue 可以額外改變一些值),讓 input 可以用來執行驗證時的事件,有 onChange、onBlur、onSubmit、touched(不熟行動裝置不太確定這項,感覺像是 oninput 但又可能不是),最後是 isSubmitting,它就是剛剛在提到 setTimeout 的地方用到的 boolean 值

這樣就完成一個表單的 component 了,為了展示我要新增一個路由來放它

src/router/Router.tsx

增加一個路由進 routes

然後筆者才發現 RouteWithSubRoutes 沒有寫成動態 path 及 component

將 PrivateRoute 修正動態 path 及 component

src/router/Router.tsx 全部程式碼

還有 PrivateRoute.tsx 也要修改一部分傳遞 props 的型別,配合 RouteI,否則型別檢查是不會通過的

然後就可以到 Header.tsx 增加 Link 按鈕了

執行結果,記得要先輸入名稱登入喔,否則是進不去設定 isPrivate 的路由的

在 blur 時就會驗證,且 submit 是無效的,要將驗證條件都修正完就會執行 submit 的 function 了,在 setTimeout 0.5 秒的期間,按鈕都會是 disable 狀態,妙吧,一堆東西它都幫你整理好了


以上就是筆者在使用 Formik 的一點小小心得

最後附上原始碼
https://github.com/littlehorseboy/typescript-react/tree/day14-formik


明天會繼續 Formik,目前這個基本款樣式似乎還不夠看阿,要搭配 material-ui 改造它一番!


上一篇
【Day 13】Redux 與 React 與 TypeScript 之小小應用
下一篇
【Day 15】Formik,在 React 製作表單的利器,搭配 Yup 及 Material-UI
系列文
TypeScript + React + 雜七雜八30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言