React 強大的表單驗證庫formik之集成Yup、React Hook Form庫

簡介

Formik 是為 React 開發的開源表單庫,提供狀態管理、驗證和提交處理功能,可簡化復雜表單的開發。

核心優勢

?- 狀態管理 ?:自動跟蹤輸入值、驗證狀態和提交進度,無需手動編寫狀態邏輯。 ?
?- 驗證功能 ?:支持聲明式驗證規則(如字段類型、長度限制、異步驗證),實時反饋錯誤信息。 ?
?- 集成能力 ?:可與 Yup (驗證)、 React Hook Form (表單鉤子)等庫組合使用,擴展功能。

安裝

npm install formik

示例

基本用法

import { useFormik } from "formik";export default function Formik() {const formik = useFormik({initialValues: {username: "",email: "",},validate: (values) => {const errors = {};if (!values.username) {errors.username = "用戶名是必填項";} else if (values.username.length < 2) {errors.username = "用戶名至少2個字符";}if (!values.email) {errors.email = "郵箱是必填項";} else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(values.email)) {errors.email = "無效的郵箱地址";}return errors;},onSubmit: (values) => {console.log(values);alert(JSON.stringify(values, null, 2));},});return (<formonSubmit={formik.handleSubmit}className="max-w-sm mx-auto mt-10 p-6 border rounded shadow"><div className="mb-4"><label htmlFor="username" className="block mb-1 font-bold">用戶名</label><inputid="username"name="username"type="text"onChange={formik.handleChange}onBlur={formik.handleBlur}value={formik.values.username}className="w-full px-3 py-2 border rounded"/>{formik.touched.username && formik.errors.username ? (<div className="text-red-500 text-sm mt-1">{formik.errors.username}</div>) : null}</div><div className="mb-4"><label htmlFor="email" className="block mb-1 font-bold">郵箱</label><inputid="email"name="email"type="email"onChange={formik.handleChange}onBlur={formik.handleBlur}value={formik.values.email}className="w-full px-3 py-2 border rounded"/>{formik.touched.email && formik.errors.email ? (<div className="text-red-500 text-sm mt-1">{formik.errors.email}</div>) : null}</div><buttontype="submit"className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">提交</button></form>);
}

集成 yup

import { useFormik } from "formik";
import * as Yup from "yup";export default function Formik() {const formik = useFormik({initialValues: {username: "",email: "",},validationSchema: Yup.object({username: Yup.string().min(2, "用戶名至少2個字符").required("用戶名是必填項"),email: Yup.string().email("無效的郵箱地址").required("郵箱是必填項"),}),onSubmit: (values) => {alert(JSON.stringify(values, null, 2));},});return (<formonSubmit={formik.handleSubmit}className="max-w-sm mx-auto mt-10 p-6 border rounded shadow"><div className="mb-4"><label htmlFor="username" className="block mb-1 font-bold">用戶名</label><inputid="username"name="username"type="text"onChange={formik.handleChange}onBlur={formik.handleBlur}value={formik.values.username}className="w-full px-3 py-2 border rounded"/>{formik.touched.username && formik.errors.username ? (<div className="text-red-500 text-sm mt-1">{formik.errors.username}</div>) : null}</div><div className="mb-4"><label htmlFor="email" className="block mb-1 font-bold">郵箱</label><inputid="email"name="email"type="email"onChange={formik.handleChange}onBlur={formik.handleBlur}value={formik.values.email}className="w-full px-3 py-2 border rounded"/>{formik.touched.email && formik.errors.email ? (<div className="text-red-500 text-sm mt-1">{formik.errors.email}</div>) : null}</div><buttontype="submit"className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">提交</button></form>);
}

集成 react-hook-form

import { useForm } from "react-hook-form";export default function Formik() {const {register,handleSubmit,formState: { errors, touchedFields },} = useForm({mode: "onChange",defaultValues: {username: "",email: "",},});const onSubmit = (values) => {console.log(values);alert(JSON.stringify(values, null, 2));};return (<formonSubmit={handleSubmit(onSubmit)}className="max-w-sm mx-auto mt-10 p-6 border rounded shadow"><div className="mb-4"><label htmlFor="username" className="block mb-1 font-bold">用戶名</label><inputid="username"{...register("username", {required: "用戶名是必填項",minLength: { value: 2, message: "用戶名至少2個字符" },})}className="w-full px-3 py-2 border rounded"/>{touchedFields.username && errors.username && (<div className="text-red-500 text-sm mt-1">{errors.username.message}</div>)}</div><div className="mb-4"><label htmlFor="email" className="block mb-1 font-bold">郵箱</label><inputid="email"type="email"{...register("email", {required: "郵箱是必填項",pattern: {value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,message: "無效的郵箱地址",},})}className="w-full px-3 py-2 border rounded"/>{touchedFields.email && errors.email && (<div className="text-red-500 text-sm mt-1">{errors.email.message}</div>)}</div><buttontype="submit"className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">提交</button></form>);
}

formik validate、yup、react-hook-form 集成對比

1. Formik 自帶 validate

  • 寫法:在 useFormik 里傳入 validate 函數,手動校驗每個字段,返回錯誤對象。
  • 優點
  • 靈活,適合簡單或自定義復雜邏輯。
  • 不依賴第三方庫。
  • 缺點
  • 代碼冗長,重復性高。
  • 維護性較差,規則多時易出錯。
  • 示例
  validate: (values) => {const errors = {};if (!values.username) {errors.username = "用戶名是必填項";} else if (values.username.length < 2) {errors.username = "用戶名至少2個字符";}// ... 其他校驗return errors;};

2. Formik 集成 Yup

  • 寫法:傳入 validationSchema,使用 Yup 對象聲明式定義規則。
  • 優點
  • 規則聲明式,簡潔易讀。
  • 支持復雜嵌套、異步校驗、類型校驗等。
  • 維護性好,易擴展。
  • 缺點
  • 需額外安裝 Yup。
  • 某些極端自定義邏輯需配合 validate。
  • 示例
  validationSchema: Yup.object({username: Yup.string().min(2, "用戶名至少2個字符").required("用戶名是必填項"),email: Yup.string().email("無效的郵箱地址").required("郵箱是必填項"),});

3. React Hook Form

  • 寫法:通過 register 注冊字段時直接傳入校驗規則,也可結合 Yup。
  • 優點
  • 語法簡潔,性能優異(按需渲染)。
  • 支持原生表單校驗、異步校驗。
  • 易與 Yup 等 schema 庫集成。
  • 缺點
  • 語法與 Formik 不同,遷移需適應。
  • 復雜表單時需結合第三方庫。
  • 示例
  {...register("username", {required: "用戶名是必填項",minLength: { value: 2, message: "用戶名至少2個字符" },})}

總結對比表

特性Formik validateFormik + YupReact Hook Form
書寫方式手寫函數聲明式 schema注冊時傳規則
依賴Yup無/可選 Yup
代碼量
維護性一般
靈活性
性能一般一般
適合場景簡單/自定義復雜邏輯規則多/復雜表單性能敏感/大表單

結論

  • 簡單表單可用 Formik 的 validate,復雜表單推薦 Yup 或 React Hook Form。
  • 追求聲明式、可維護性優先用 Yup。
  • 性能和體驗優先可選 React Hook Form。

?React 強大的表單驗證庫formik之集成Yup、React Hook Form庫 - 高質量源碼分享平臺-免費下載各類網站源碼與模板及前沿動態資訊

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

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

相關文章

破解風電運維“百模大戰”困局,機械版ChatGPT誕生?

面對風機87%的非計劃停機&#xff0c;30多個專用模型為何束手無策&#xff1f;一套通用大模型如何實現軸承、齒輪、轉子“一站式”健康管理&#xff1f;一、行業痛點&#xff1a;風機運維深陷“碎片化泥潭”1.1 87%停機故障由多部件引發齒輪斷裂、軸承磨損、電機短路……風電故…

Spring Bean 控制銷毀順序的方法總結

控制Spring Bean銷毀順序的方法 在Spring框架中&#xff0c;有幾種方法可以控制Bean的銷毀順序。以下是主要的幾種方式及其示例代碼&#xff1a; 1. 實現DisposableBean接口 實現DisposableBean接口并重寫destroy()方法&#xff0c;Spring會按照依賴關系的相反順序調用這些方…

Gemini CLI MCP 教程:設置、命令與實際使用

如果你想要為任何 MCP 服務器設置 Gemini CLI,這個快速教程將為你提供指導。 Gemini CLI 結合 MCP(模型上下文協議)服務器,改變了你通過自然語言命令進行編碼的方式。 你可以要求 Gemini 分析你的代碼庫、管理文件、查詢數據庫,或通過對話提示與 API 交互。 MCP 服務器連…

LangChain 構建向量數據庫和檢索器

LangChain 構建向量數據庫和檢索器實戰 隨著大語言模型&#xff08;LLM&#xff09;在各類 AI 應用中不斷普及&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09;逐漸成為提升回答準確率與上下文關聯性的重要技術路徑。 一、什…

基于 LangChain 實現通義千問 + Tavily 搜索 Agent 的簡單實踐

文章目錄 一、相關背景1.1 LangChain 簡介1.2 通義千問&#xff08;Tongyi Qianwen&#xff09;1.3 Tavily 實時搜索引擎1.4 架構總覽 二、環境配置設置 API 密鑰 三、 Tavily 搜索四、智能 Agent 示例&#xff1a;自動判斷是否調用 Tavily4.1 初始化 Agent4.2 提問兩個問題&am…

SegGPT: 在上下文中分割一切

摘要 我們提出了 SegGPT&#xff0c;一個在上下文中執行“分割一切”的通用模型。我們將各種分割任務統一為一個通用的上下文學習框架&#xff0c;通過將不同類型的分割數據轉換為相同的圖像格式來兼容這些差異。SegGPT 的訓練被建模為一個帶有隨機顏色映射的上下文著色問題。…

【網絡】Linux 內核優化實戰 - net.core.busy_read

目錄 核心功能工作原理與優勢配置方式1. 臨時配置&#xff08;重啟失效&#xff09;2. 永久配置&#xff08;重啟生效&#xff09; 與 net.core.busy_poll 的協同作用適用場景與注意事項適用場景&#xff1a;注意事項&#xff1a; 總結 net.core.busy_read 是 Linux 內核中與網…

alpine安裝及配置nodejs開發測試環境

在Alpine Linux上安裝和使用Node.js&#xff0c;打造開發和測試的環境。 apk倉庫打開社區的源。 先在命令行中使用命令apk search nodejs npm yarn對倉庫源進行搜索&#xff0c;&#xff0c;看看nodejs、yarn、npm的版本情況。 localhost:~# apk search nodejs npm yarn nod…

Apache Commons Pool中的GenericObjectPool詳解

GenericObjectPool 是 Apache Commons Pool 庫中的核心類&#xff0c;用于實現對象的池化管理&#xff0c;適用于數據庫連接、HTTP 客戶端、線程等昂貴資源的復用。以下從核心概念、工作原理、參數配置、使用場景及最佳實踐等方面詳細解析&#xff1a; ?? 一、核心概念與組成…

攻防世界CTF題目解析系列————(1)

題目來源:攻防世界wife_wife 打開題目之后&#xff0c;發現登錄界面&#xff0c;然后嘗試弱口令&#xff0c;sql二次注入&#xff0c;xss發現都沒有&#xff0c;然后看見下面go register&#xff08;去注冊&#xff09;按鈕 成功注冊&#xff08;username和password隨便搞&…

楚存科技SD NAND貼片式T卡—高性能存儲解決方案、賦能AI智能硬件

楚存科技SD NAND貼片式T卡—高性能存儲解決方案、賦能AI智能硬件應用 在 AIoT 技術重構產業生態的時代浪潮中&#xff0c;智能硬件正從單一功能終端向數據樞紐演進 —— 智能家居設備日均產生 TB 級交互數據&#xff0c;工業物聯網傳感器需實時存儲生產參數&#xff0c;車載智…

Python[數據結構及算法 --- 查找]

一.順序查找&#xff08;無序表&#xff09;&#xff1a; def sequentialSearch(alist, item):pos 0found Falsewhile pos < len(alist) and not found:if alist[pos] item:found Trueelse:pos pos 1return foundtestlist [1, 2, 32, 8, 17, 19, 42, 13, 0] print(s…

Seata Saga模式實戰:Java微服務中的分布式事務管理

在分布式系統中&#xff0c;Saga模式是一種用于管理跨多個服務的事務的柔性事務解決方案。它通過將長事務拆分為多個本地事務&#xff08;每個事務對應一個服務的操作&#xff09;&#xff0c;并通過補償機制保證最終一致性。以下是Java中Saga模式的詳細介紹&#xff0c;包括實…

若依學習筆記1-validated

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 保證 Spring AOP 相關的依賴包 --><dependency><groupId>org.springframework.boot<…

Excel 如何處理更復雜的嵌套邏輯判斷?

處理復雜的嵌套邏輯判斷&#xff0c;是Excel進階路上必然會遇到的一道坎。當簡單的IF函數“套娃”變得冗長、難以閱讀和維護時&#xff0c;我們就需要更高級、更清晰的工具。 這里介紹三種從基礎到高級的處理方法&#xff1a; 傳統的 IF 函數嵌套 (經典&#xff0c;但容易混亂)…

使用Claude和MCP增強Selenium

1.配置MCP服務器打開Claude Desktop—>Settings—>Developer—>Edit Config{"mcpServers": {"selenium": {"command": "npx","args": ["-y", "angiejones/mcp-selenium"]}} }配置完成后重啟Cl…

數據倉庫錨點建模方法的前世今生

數據倉庫錨點建模方法&#xff08;Anchor Modeling&#xff09;作為一種面向復雜數據環境的創新方法論&#xff0c;其發展歷程與技術演進深刻反映了數據管理從結構化到動態化的轉型需求。以下從起源、發展、核心思想、技術演進及未來趨勢五個維度&#xff0c;系統梳理錨點建模的…

<三>Sping-AI alibaba 文生圖

環境和配置請看&#xff1c;二&#xff1e;Sping-AI alibaba 入門-記憶聊天及持久化 源代碼&#xff1a;https://github.com/springaialibaba/spring-ai-alibaba-examples/blob/main/spring-ai-alibaba-image-example/dashscope-image/src/main/java/com/alibaba/cloud/ai/exam…

vue組件和模板

好的&#xff0c;我們來詳細解釋一下在 Vue&#xff08;以及現代前端開發&#xff09;中兩個最核心的概念&#xff1a;組件 (Component) 和 模板 (Template)。 理解了它們&#xff0c;就等于掌握了現代 Web 應用開發的基石。 一個核心比喻&#xff1a;樂高積木 在開始前&…

python學習打卡:DAY 18 推斷聚類后簇的類型

浙大疏錦行 聚類后的分析&#xff1a;推斷簇的類型 知識點回顧&#xff1a; 推斷簇含義的2個思路&#xff1a;先選特征和后選特征通過可視化圖形借助ai定義簇的含義科研邏輯閉環:通過精度判斷特征工程價值 作業&#xff1a;參考示例代碼對心臟病數據集采取類似操作&#xff0c;…