React七Formik

Formik是一個專為React構建的開源表單庫。它提供了一個易于使用的API來處理表單狀態管理,表單驗證以及表單提交。Formik支持React中的所有表單元素和事件,可以很好地與React生態系統中的其他庫集成。同時,Formik還提供了一些高級功能,如支持異步驗證、字段級別的驗證、根據表單狀態變化自動計算屬性等。

Formik 基礎

Formik的優勢,相較于傳統的表單處理方法,Formik具有以下優勢:

  • 狀態管理: Formik自動地處理表單狀態管理,無需手動編寫大量的狀態管理邏輯。
  • 表單驗證: Formik提供了易于使用的表單驗證工具,可以快速實現表單驗證邏輯。
  • 表單提交: Formik可以方便地處理表單提交,包括異步表單提交和重試機制。
  • 支持復雜表單: Formik支持處理包括多級嵌套、動態表單、數組表單等多種復雜表單。

Formik 安裝和簡單使用

1、Formik安裝,使用npm或yarn安裝Formik。在終端中,切換項目目錄并運行此命令 npm install formikyarn add formik

2、表單數據綁定以及提交處理

useFormik HOOK 參數說明:

  • initialValues:傳遞定義的輸入HTML元素的name屬性相匹配的初始值
  • onSubmit:提交程序,已經默認阻止了默認行為

onSubmit 屬性定義了一個回調函數,在表單提交時被調用。在回調函數中可以訪問表單中所有輸入框的值并執行提交操作,通過 setSubmitting 函數,可以設置表單的提交狀態。在表單的渲染函數中通過 handleSubmit 屬性來處理表單的提交,使用 isSubmitting(默認false) 屬性來禁用提交按鈕,直到表單提交完成。

        const formik = useFormik({initialValues: {username: '',password: ''},onSubmit: (values, {setSubmitting}) => {// formik 已經默認幫我們阻止了默認執行console.log('values: ', values);setSubmitting(true)}})……<form onSubmit={formik.handleSubmit}><div><label htmlFor="username">用戶名:</label><input id="username" type="text" name="username" value={formik.values.username} onChange={formik.handleChange}></input></div><div><label htmlFor="password">密碼:</label><input id="password" type="password" name="password" value={formik.values.password} onChange={formik.handleChange}></input></div><button type="submit" disabled={formik.isSubmitting}>提交</button></form>

useFormik 返回對象屬性解釋:

  • handleSubmit:提交處理程序
  • handleChange:傳遞給每個<input><select>、 或<textarea>的更改處理程序
  • values:表單的當前值,使用 name 訪問對應的值
  • handleChange:每個 HTML 輸入重用相同的更改處理函數
  • setValues和setFieldValue:setValues設置formik的values屬性值,setFieldValue設置values的某一個屬性值,二者寫法不同,但是目的一樣改變values的值。

如果沒有 formik,那么就得一個個寫change事件。

3、表單校驗

Formik 不僅跟蹤表單values,還跟蹤其驗證和錯誤消息。要使用 JS 添加驗證,需指定一個自定義驗證函數并將其傳遞給鉤子 useFormik() 的參數 validate。如果存在錯誤,這個自定義驗證函數應該生成一個匹配的error對象。

            validate: values => {const errors = {}if (!values.username) {errors.username = '請輸入用戶名'} else if (values.username.length < 6 || values.username.length > 16) {errors.username = '請輸入6~16位的用戶名'} else if (!/^\w{6,16}$/.test(values.username)) {errors.username = '請輸入由字母、數字、下劃線組成的用戶名'}if (!values.password) {errors.password = '請輸入密碼'} else if (values.password.length < 6 || values.password.length > 16) {errors.password = '請輸入6~16位的密碼'} else if (!/^\w{6,16}$/.test(values.password)) {errors.password = '請輸入由字母、數字、下劃線組成的密碼'}console.log('errors: ', errors);return errors}

默認情況下,Formik 將在每次擊鍵(onChange)事件以及提交之前進行驗證。傳遞 formik.handleBlur 給輸入元素的 onBlur 屬性,那么會在輸入元素的失焦(onBlur)事件中進行驗證:

    <input id="username" type="text" name="username" value={formik.values.username} onChange={formik.handleChange} onBlur={formik.handleBlur}></input>

校驗確實實現了,但是如果希望在提交表單的時候再顯示錯誤,需要怎么做呢?
Formik 會跟蹤哪些字段已被訪問過。它將這些信息存儲在一個名為 touched 的對象中,這些值為boolean值。

        <p>{formik.touched.username && formik.errors.username ? formik.errors.username : ''}</p>

Formik 結合 Yup 進行表單驗證

Yup是一個構建對象模式的JavaScript模式驗證器,用于驗證和解析數據。它提供了一種聲明式方法來創建校驗模式。

由于 Formik 作者/用戶非常喜歡Yup,因此 Formik 有一個名為 Yup 的特殊配置道具validationSchema,它會自動將 Yup 的驗證錯誤消息轉換為一對象。

1、Yup 安裝 npm install yupyarn add yup

2、使用 Yup 校驗表單:

  • Formik 結合 Yup 可以輕松實現表單驗證 validationSchema={Yup.object({...})},使用 validationSchema 和 Yup 搭配之后就不需要再使用validate配置了。
  • Yup 允許創建復雜的校驗邏輯,如必填項、字符長度、正則表達式等。
            validationSchema: Yup.object({username: Yup.string().required('請輸入用戶名').min(6, '請輸入6~16位的用戶名').max(16, '請輸入6~16位的用戶名').matches(/^\w{6,16}$/, '請輸入由字母、數字、下劃線組成的用戶名'), password: Yup.string().required('請輸入密碼').min(6, '請輸入6~16位的密碼').max(16, '請輸入6~16位的密碼').matches(/^\w{6,16}$/, '請輸入由字母、數字、下劃線組成的密碼')})

Formik 組件

以上都是通過 useFormik 拿到控制formik表單的內容,但是這樣不容易形成封裝,也就是說無法進行實例傳值。而Formik由于配備了React Context,因此Formik本身就可以管理所包裹的JSX。

formik完全遵守React的組件化原則,可以和其他庫或自定義邏輯無縫集成:

  • formik支持構建和復用表單組件,通過<Formik />組件和Context API實現跨組件通信。
  • 可以創建包裝<Field />ErrorMessage等的自定義組件,提高代碼復用性和可維護性。
            <Formik initialValues={{username: '', password: ''}} // 設置初始化值onSubmit={(values, {setSubmitting}) => { // 提交表單執行的函數setTimeout(() => {console.log('values: ', values); setSubmitting(true)}, 2000);}}validationSchema={Yup.object({ // 設置表單校驗的模式username: Yup.string().required('請輸入用戶名').min(6, '請輸入6~16位的用戶名').max(16, '請輸入6~16位的用戶名').matches(/^\w{6,16}$/, '請輸入由字母、數字、下劃線組成的用戶名'), password: Yup.string().required('請輸入密碼').min(6, '請輸入6~16位的密碼').max(16, '請輸入6~16位的密碼').matches(/^\w{6,16}$/, '請輸入由字母、數字、下劃線組成的密碼')})}>{({handleSubmit, values, touched, handleChange, handleBlur, errors, isSubmitting}) => {return <form onSubmit={handleSubmit}><div><label htmlFor="username1">用戶名:</label>{/* <input id="username1" type="text" name="username" value={values.username} onChange={handleChange} onBlur={handleBlur}></input> */}<Field id='username1' name='username' type='text'></Field>{/* <p>{touched.username && errors.username ? errors.username : ''}</p> */}<ErrorMessage name="username"></ErrorMessage></div><div><label htmlFor="password1">密碼:</label><input id="password1" type="password" name="password" value={values.password} onChange={handleChange}></input><p>{touched.password && errors.password ? errors.password : ''}</p></div><button type="submit" disabled={isSubmitting}>提交</button></form>}}</Formik>
常用組件

1、ErrorMessage 捕捉錯誤的容器,必傳一個name屬性。

    <ErrorMessage name="username"></ErrorMessage>

2、Field 將自動將輸入連接到 Formik,默認渲染是input輸入框,有以下幾種方法渲染:

    function MyField({field, form}) {console.log('field: ', field);console.log('form: ', form);return <input {...field}></input>}……<Formik initialValues={{email: '', project: 2, phone: '', address: '1'}} // 設置初始化值onSubmit={(values) => { console.log('values: ', values); }} // 提交表單執行的函數validationSchema={Yup.object({ // 設置表單校驗的模式phone: Yup.string().required('請輸入電話號碼').matches(/^1[0-9]{10}/, '請輸入有效的電話號碼')})}>{({handleSubmit}) => {return <form onSubmit={handleSubmit}>{/* 1、直接渲染 */}<Field type='email' name='email' placeholder='請輸入電子郵箱'></Field> <br/>{/* 2、as 轉化成其他節點 */}<Field as='select' name='project'><option value={1}>數學及應用數學</option><option value={2}>軟件工程</option><option value={3}>國際貿易</option></Field> <br/>{/* 3、渲染 jsx */}<Field name='phone'>{({field, form, meta}) => {console.log('field: ', field);console.log('form: ', form);console.log('meta: ', meta);return <div><label htmlFor="phone">電話號碼</label><input id="phone" type="text" placeholder="請輸入電話號碼" value={field.value.phone} {...field}></input><p>{ meta.touched && meta.error ? meta.error : ''}</p></div>}}</Field>{/* 4、以 component 組件形式渲染 */}<Field name='address' component={MyField}></Field> <br /><button type="submit">提交</button></form>}}</Formik>

數組和對象校驗

Formik 支持嵌套對象和數組:

  • yup 對象校驗使用 Yup.object({})
  • yup 數組校驗使用 Yup.array().of()
        <FormikinitialValues={{social: {wechat: '', qq: ''}, frends: ['', '']}}onSubmit={(values, {setSubmitting}) => {console.log('values: ', values)setSubmitting(true)}} validationSchema={Yup.object({social: Yup.object({wechat: Yup.string().required('請輸入微信'), qq: Yup.string().required('請輸入QQ').matches(/^[\w]$/, '請輸入有效的QQ')}),frends: Yup.array().of(Yup.string().required('請輸入你的朋友'))})}>{({values, handleChange, handleBlur, touched, errors, isSubmitting, setValues, setFieldValue}) => {console.log('object array values: ', values);console.log('object array handleChange: ', handleChange);console.log('object array handleBlur: ', handleBlur);console.log('object array touched: ', touched);console.log('object array errors: ', errors);console.log('object array setValues: ', setValues);console.log('object array setFieldValue: ', setFieldValue);return <form><h4>社交賬號</h4><label>微信:</label><input name="social.wechat" value={values.social.wechat} onChange={handleChange} onBlur={handleBlur}></input><p>{ touched.social && errors.social && touched.social.wechat && errors.social.wechat ? errors.social.wechat : ''}</p><br /><label>QQ:</label><input name="social.qq" value={values.social.qq} onChange={handleChange} onBlur={handleBlur}></input><h4>朋友</h4>{values.frends.map((v, i) => {return (<div key={i}><input name={`friends[${i}]`} onChange={handleChange} onBlur={handleBlur}></input>{i < values.frends.length && <br />}</div>)})}<button type="submit" disabled={isSubmitting}>提交</button></form>}}</Formik>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896574.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Kimi】自動生成PPT-并支持下載和在線編輯--全部免費

【Kimi】免費生成PPT并免費下載 用了好幾個大模型&#xff0c;有些能生成PPT內容&#xff1b; 有些能生成PPT&#xff0c;但下載需要付費&#xff1b; 目前只有Kimi生成的PPT&#xff0c;能選擇模板、能在線編輯、能下載&#xff0c;關鍵全部免費&#xff01; 一、用kimi生成PP…

編寫一個程序,計算并輸出1到100的和(Python版)

編寫一個程序&#xff0c;計算并輸出1到100的和 以下是兩種計算1到100之和的方法&#xff1a; 方法一&#xff1a;循環累加法&#xff08;適合編程練習&#xff09; total 0 for num in range(1, 101):total num print("1到100的和為:", total)原理&#xff1a;通…

MyBatis-Plus 自動填充功能

MyBatis-Plus&#xff08;MP&#xff09; 提供了一個非常強大的功能——自動填充功能。該功能可以在執行插入或更新操作時&#xff0c;自動為某些字段賦值&#xff0c;免去手動設置這些字段的麻煩。常見的應用場景包括 創建時間 和 更新時間 字段的自動填充&#xff0c;幫助開發…

final 關鍵字在不同上下文中的用法及其名稱

1. final 變量 名稱&#xff1a;final 變量&#xff08;常量&#xff09;。 作用&#xff1a;一旦賦值后&#xff0c;值不能被修改。 分類&#xff1a; final 實例變量&#xff1a;必須在聲明時或構造函數中初始化。 final 靜態變量&#xff1a;必須在聲明時或靜態代碼塊中初…

springboot項目部署腳本

Springboot部署腳本 該腳本可用于jenkins自動執行&#xff0c;具有以下功能 適配所有以內嵌tomcat容器springboot項目jar包可根據參數選擇環境&#xff0c;基于profiles可自動識別并關閉已存在進程第一個參數是指定jar包所在絕對路徑(該路徑下必須有且僅有一個.jar文件) 第二…

向量數據庫milvus部署

官方文檔 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比較簡單&#xff0c;這里說一下遇到的問題 一&#xff1a;Docker Compose 方式部署 1、鏡像無法拉取,(docker.io被禁) …

【密碼學實戰】Java 實現 SM2 國密算法(簽名帶id、驗簽及 C1C3C2 加密解密)

前言 SM2是中國國家密碼管理局發布的橢圓曲線公鑰密碼算法標準&#xff08;GB/T 32918&#xff09;&#xff0c;屬于國密算法體系。與RSA和ECDSA相比&#xff0c;SM2在相同安全強度下密鑰更短、計算效率更高。本文將介紹如何在Java中實現SM2的密鑰生成、數字簽名、驗簽、加密及…

網絡原理---TCP/IP

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…

【大語言模型筆記進階一步】提示語設計學習筆記,跳出框架思維,自己構建提示詞

一、大語言模型應用場景 1. 文本生成 文本創作&#xff1a; 詩歌故事&#xff0c;劇本&#xff0c;推文帖子 摘要與改寫&#xff1a; 長文本摘要與簡化&#xff0c;多語言翻譯與本地化 結構化生成&#xff1a; 表格&#xff0c;根據需求生成代碼片段&#xff0c;API文檔生成…

Unity XR-XR Interaction Toolkit開發使用方法(十一)組件介紹(XR Interactable)

目錄 一、插件介紹 二、主要組件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor XR Interaction Group 三、XR Interactable 1、組件介紹 2、核心功能與特點 交互類型支…

Spring Boot spring-boot-maven-plugin 參數配置詳解

一 spring-boot-maven-plugin 插件的5個Goals spring-boot:repackage&#xff0c;默認goal。在mvn package之后&#xff0c;再次打包可執行的jar/war&#xff0c;同時保留mvn package生成的jar/war為.origin&#xff1b;重新打包存在的jar或者war包從而使他們可以在命令行使用…

eMMC安全簡介

1. 引言 術語“信息安全”涵蓋多種不同的設計特性。一般而言&#xff0c; 信息安全是指通過實踐防止信息遭受未經授權的訪問、使用、披露、中斷、篡改、檢查、記錄或銷毀。 信息安全的三大核心目標為 機密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integr…

Python 數據結構 2.時間復雜度和空間復雜度

Life is a journey —— 25.2.28 一、引例&#xff1a;窮舉法 1.單層循環 所謂窮舉法&#xff0c;就是我們通常所說的枚舉&#xff0c;就是把所有情況都遍歷了的意思。 例&#xff1a;給定n&#xff08;n ≤ 1000&#xff09;個元素ai&#xff0c;求其中奇數有多少個 判斷一…

FFmpeg-chapter3-讀取視頻流(原理篇)

ffmpeg網站&#xff1a;About FFmpeg 1 庫介紹 &#xff08;1&#xff09;libavutil是一個包含簡化編程函數的庫&#xff0c;包括隨機數生成器、數據結構、數學例程、核心多媒體實用程序等等。 &#xff08;2&#xff09;libavcodec是一個包含音頻/視頻編解碼器的解碼器和編…

面試(進階) —虛擬列表在什么場景使用,如何實現?

面試(進階) —虛擬列表在什么場景使用&#xff0c;如何實現&#xff1f; 在前端開發中&#xff0c;當需要渲染大量數據時&#xff0c;傳統的渲染方式往往會遇到性能瓶頸。一次性將大量數據渲染到DOM中&#xff0c;不僅會導致頁面加載緩慢&#xff0c;還可能占用大量內存&#x…

Linux Mem -- 關于AArch64 MTE功能的疑問

目錄 1.虛擬地址和物理地址映射完成后&#xff0c;才可以設置虛擬地址對應的memory tag &#xff1f; 2.各種memory allocator中的address tag從哪來&#xff0c;怎么產生&#xff1f; 2.1 vmalloc allocator 2.2 slub分配器 2.3 用戶可以指定IRG指令產生的address tag 3.kasan…

python-leetcode-顏色分類

75. 顏色分類 - 力扣&#xff08;LeetCode&#xff09; class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""low, mid, high 0, 0, len(nums) - 1while mid < h…

ArcGIS Pro技巧實戰:高效矢量化天地圖地表覆蓋圖

在地理信息系統&#xff08;GIS&#xff09;領域&#xff0c;地表覆蓋圖的矢量化是一項至關重要的任務。天地圖作為中國國家級的地理信息服務平臺&#xff0c;提供了豐富且詳盡的地表覆蓋數據。然而&#xff0c;這些數據通常以柵格格式存在&#xff0c;不利于進行空間分析和數據…

【江科大STM32】TIM輸出比較(學習筆記)

本章圖片文字內容也為重要知識&#xff0c;請馬住&#xff01; 輸出比較簡介 OC&#xff08;Output Compare&#xff09;輸出比較輸出比較可以通過比較CNT與CCR寄存器值的關系&#xff0c;來對輸出電平進行置1、置0或翻轉的操作&#xff0c;用于輸出一定頻率和占空比的PWM波形…

【網絡安全 | 漏洞挖掘】利用文件上傳功能的 IDOR 和 XSS 劫持會話

未經許可,不得轉載。 本文涉及漏洞均已修復。 文章目錄 前言正文前言 想象這樣一個場景:一個專門處理敏感文檔的平臺,如保險理賠或身份驗證系統,卻因一個設計疏漏而成為攻擊者的“金礦”。在對某個保險門戶的文件上傳功能進行測試時,我意外發現了一個可導致大規模賬戶接管…