讲师中心 微信公众号
AI工具推荐 视频效率加速

如何使用 Formik & Yup 进行表单验证

风萱小哥_3535

风萱小哥_3535

发布时间:2024-07-17 09:25:02

|

795人浏览过

|

来源于dev.to

转载

欢迎回来,编码员们!

今天,我们将在分步框架中使用名为“formik”的前端库与名为“yup”的模式构建器相结合,以帮助您理解和在 react 表单上实现验证。

formik 和 yup 是什么?

当我第一次开始学习 formik(并使用 yup)时,我对它没有信心,因为我不明白它的用途。因此,在开始分步过程之前,让我们确保我们在理解 formik 和 yup 是什么以及它们为何重要方面达成共识。
formik 是 react 中使用的一个库,其官方文档自豪地声明它允许您“在 react 中构建表单,无需流泪”(请参阅​​参考部分中的“*formik”)。该声明的真正含义是,formik 会跟踪值、验证、提交等,以节省您的时间并让您在心里跟踪代码中更重要的细节 (*formik)。
正如我之前提到的,yup 是一个模式构建器(也是一个库),允许您定义模式并与 formik 一起使用它来创建验证(*是的)。

好吧,现在我们来谈谈在 react 中使用 formik 和 yup 验证表单的步骤。

福米克和是的基础知识

在我们深入实践示例之前,让我们详细说明我们需要采取的步骤:

  1. 导入必要的库以使 formik 和 yup 运行。
  2. 为我们的 yup 模式创建一个函数。
  3. 在 formik 函数内部,定义初始值、验证模式和 onsubmit 指令。
  4. 更新我们的 jsx 以使用 formik。

让我们开始吧!

formik 和 yup 分步指南

最近我构建了一个简单的目标跟踪器应用程序,并在“添加目标”表单中使用 formik 来验证用户摄入量并确保该值是长度在 1-20 个字符之间的字符串。
我将使用“添加目标”表单作为示例。
首先,这就是表单在用户界面中的样子:

add goal button

现在您已经知道基本 ui 是什么样子了,让我们过渡到代码。
这就是我们开始的地方(没有任何 formik 或 yup):

import react from "react";

function addgoal({ handlegoal }){ 

    return(
        <div>
            <form onsubmit= >
                <input 
                    id="goal"
                    name="goal"
                    type="text" 
                    value=
                    placeholder = "add a new goal"
                    onchange=
                />
                <br></br>
                <button type="submit">add my goal</button>
                <br></br>
                <p></p>
                <br></br>
            </form>
        </div>
    )
};

export default addgoal

现在让我们实施上面概述的步骤:

1. 导入必要的库以使 formik 和 yup 运行。

在页面顶部附近,我们将导入所需的库:

import react from "react";
import { useformik } from "formik";
import * as yup from "yup";

// rest of code

2. 为您的 yup 模式创建一个函数。

现在我们可以使用 formik 和 yup,我们将首先使用 yup 来创建验证(“添加目标”只有一个用户输入“目标”,但如果您有更多,则需要添加逗号他们之间):

function addgoal({ handlegoal }){
    const formschema = yup.object().shape({
        goal: yup.string().required("please enter a goal with at least 1 character.").max(20)
    })

// rest of code

在上面的代码中,我们声明了一个变量“formschema”,并使用 yup 及其“object()”和“shape()”方法。这些方法基本上是在说“这是一个对象,它的‘形状’如下所示”。
在我们稍后将在对数据库的 post 请求中使用的“目标”键上,我们再次使用 yup 和以下方法来为用户输入创建验证:.string()、.required() 和.max().

虽然我们的代码在技术上还不能工作,但让我们暂时假装它可以工作,看看当我们尝试添加目标而不在输入表单中输入任何内容时会发生什么:

finished form with validation error example
在这里我们可以看到验证触发了formschema的“.required()”部分并抛出了错误。

好吧,回到现实,我们还没有完成所有需要的事情来获得这些验证错误,如上图所示......让我们继续下一步。

3. 在 formik 函数中,我们将定义初始值、验证模式以及何时触发 onsubmit 的说明。

我们的待办事项列表中的下一步是创建一个名为“formik”的变量。在此变量内,我们将调用“useformik”挂钩并定义表单的初始值,调用 formschema 来定义 useformik 挂钩内的模式,使用新的用户值发出发布请求,最后重置形式.

让我们把这个过程分成几个部分:
1)首先,声明一个变量并为其分配 useformik 钩子:

function addgoal({ handlegoal }){
    const formschema = yup.object().shape({
        goal: yup.string().required("please enter a goal with at least 1 character.").max(20)
    })

    const formik = useformik({})

    //rest of code

2)定义表单的初始值:

function addgoal({ handlegoal }){
    const formschema = yup.object().shape({
        goal: yup.string().required("please enter a goal with at least 1 character.").max(20)
    })

    const formik = useformik({
        initialvalues: {
            goal: ""
        }, 
    })

    //rest of code

(确保在初始值对象末尾包含逗号)。

3)添加validationschema键时使用formschema:

function addgoal({ handlegoal }){
    const formschema = yup.object().shape({
        goal: yup.string().required("please enter a goal with at least 1 character.").max(20)
    })

    const formik = useformik({
        initialvalues: {
            goal: ""
        },
        validationschema: formschema,
    })

    // rest of code

4)给 onsubmit 一个带有“values”和“{resetform }”参数的函数:

function addgoal({ handlegoal }){
    const formschema = yup.object().shape({
        goal: yup.string().required("please enter a goal with at least 1 character.").max(20)
    })

    const formik = useformik({
        initialvalues: {
            goal: ""
        },
        validationschema: formschema,
        onsubmit: (values, { resetform })=>{}
    })

    // rest of code

在 onsubmit 中,我们将创建 post 请求(我们将不会在本文中详细介绍如何构建)。然而,在我们的第二个“.then()”中,我们将调用“resetform(‘’)”以便在用户提交表单后清除表单。

function addgoal({ handlegoal }){
    const formschema = yup.object().shape({
        goal: yup.string().required("please enter a goal with at least 1 character.").max(20)
    })

    const formik = useformik({
        initialvalues: {
            goal: ""
        },
        validationschema: formschema,
        onsubmit: (values, { resetform })=>{

            const configobj = {
                method: 'post',
                headers: {'content-type': 'application/json'},
                body: json.stringify(values)
            }
            const url = `http://localhost:5555/goals`
            fetch(url, configobj)
            .then(r=>r.json())
            .then(goalobj => {
                handlegoal(goalobj);
                resetform("");
            })
        }
    })

//rest of code

这就是你拥有的!我们已经完成了 formik 函数的创建!这只剩下我们最后一件事要做:

4.更新 jsx 以使用 formik
(我们更新前的 jsx :)

// previous code

return(
        <div>
            <form onsubmit= >
                <input 
                    id="goal"
                    name="goal"
                    type="text" 
                    value=
                    placeholder = "add a new goal"
                    onchange=
                />
                <br></br>
                <button type="submit">add my goal</button>
                <br></br>
                <p></p>
                <br></br>
            </form>
        </div>
    )
};

export default addgoal

  • 让我们更新 jsx 中的以下项目: 使用 formik 更新“onsubmit”:
// previous code

return(
        <div>
          <form onsubmit={formik.handlesubmit}>

          // rest of code

  • (在我们的输入标签内)用 formik 更新“值”:
// previous code

return(
        <div>
          <form onsubmit={formik.handlesubmit}>
                <input 
                    id="goal"
                    name="goal"
                    type="text" 
                    value={formik.values.goal}
                    placeholder = "add a new goal"
                    onchange=
                />

          // rest of code

  • (仍在我们的输入标签内)使用 formik 更新“onchange”:
// previous code

return(
        <div>
          <form onsubmit={formik.handlesubmit}>
                <input 
                    id="goal"
                    name="goal"
                    type="text" 
                    value={formik.values.goal}
                    placeholder = "add a new goal"
                    onchange={formik.handlechange}
                />

          // rest of code

  • 让我们回到本文前面演示验证错误的时候,并通过在

    标签中创建样式错误来完成设置:

// Previous code

    return(
        <div>
            <form onSubmit={formik.handleSubmit}>
                <input 
                    id="goal"
                    name="goal"
                    type="text" 
                    value={formik.values.goal}
                    placeholder = "Add A New Goal"
                    onChange={formik.handleChange}
                />
                <br></br>
                <button type="submit">Add My Goal</button>
                <br></br>
                <p style={{ color: "red" }}>{formik.errors.goal}</p>
                <br></br>
            </form>
        </div>
    )
};

export default AddGoal

就是这样!我们刚刚演示了如何在代码中轻松创建 formik/yup 验证!

回顾:

如果您将来需要快速参考 formik 和 yup,请按照以下步骤正确验证表单:

1.导入必要的库以使 formik 和 yup 运行。

2.为您的 yup 模式创建一个函数。

3.创建一个调用 useformik 挂钩的函数。在钩子内部,定义:
1) 初始值.
2) 验证模式
3) onsubmit [给它一个带有“values”和{resetform}的函数。发出 post 请求并调用 resetform(“”) 来清除输入]。

4.更新您的 jsx 以使用 formik:
1) 在你的form标签中,将formik.handlesubmit添加到‘onsubmit’。
2) 在你的 input 标签中,将 formik.values.(goal) 添加到 ‘value’.
3) 在您的 input 标签中,将 formik.handlechange 添加到 ‘onchange’。
4) 创建一个 paragraph 标签,其样式为 formik.errors.(目标).

快乐编码!

参考

*福米克:https://formik.org/

*是的:https://www.npmjs.com/package/yup

flatiron school 的 phase-4 formik 和 form validation lesson 也被作者参考,但没有引用。有关 flatiron 学校的更多信息,请访问他们的网站。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6259

2023.08.02

ThinkPHP表单验证与数据安全处理实战
ThinkPHP表单验证与数据安全处理实战

本专题聚焦 ThinkPHP 在表单处理中的验证与安全机制,系统讲解验证器使用、自定义规则、场景验证以及错误提示处理。内容涵盖 XSS 防护、SQL 注入防御、数据过滤与输入校验等关键安全措施。通过实际案例,帮助开发者构建安全可靠的数据处理流程。

241

2026.03.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2644

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6044

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5589

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7274

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

10534

2024.04.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn