reactjs - 如何使用 Formik 和 Yup 验证 material-ui 选择
问题描述
我刚从 Yup 和 Formik 开始。我有一个非常基本的表格。在使用 Yup 进行验证方面,我拥有的 TextFields 工作得很好。选择是我遇到的麻烦。我一直试图让它像我的文本字段一样被要求。我已经用谷歌搜索了一段时间,但到目前为止我还没有找到任何有帮助的东西。
我尝试进行自己的验证,该验证发生在 onBlur 并且有效,但是当只是尝试保存而不填充任何值时失败了。文本字段将显示为必需,但选择不会显示任何内容。您可以填写文本字段并再次尝试保存。这样做会立即显示 select 所需的消息,因为它可以提交。据我所知,直到所有 Yup 必填字段都准备就绪后,formik 才会提交。我将在下面发布我正在尝试的内容,任何帮助将不胜感激。
如果我注释掉 Yup 验证要求并注销提交时的值,则确实会显示所选值,因此至少似乎可以正常工作。只是无法弄清楚如何验证它。
import React, { useEffect, useState } from "react";
import Button from '@material-ui/core/Button'
import Grid from '@material-ui/core/Grid'
import { TextField, Select } from "formik-material-ui";
import { Formik, Form, Field } from "formik";
import * as Yup from "yup";
import MenuItem from "@material-ui/core/MenuItem"
const Validation = Yup.object().shape({
FirstName: Yup.string().required("Required"),
LastName: Yup.string().required("Required"),
Gender: Yup.string().required("Required"),
});
<Formik
onSubmit={(values) => {
SaveSettings(values)
}}
enableReinitialize
validateOnChange={false}
initialValues={data}
validationSchema={Validation}
>
{({ submitForm, handleChange }) => (
<Form>
<Field
component={Select}
name="Gender"
variant="outlined"
label="Gender"
className={classes.formControl}
onChange={e => handleChange(e)} >
<MenuItem value="Male">Male</MenuItem>
<MenuItem value="Female">Female</MenuItem>
</Field>
<Grid item>
<Field
disabled={false}
component={TextField}
data-id="FirstName"
variant="outlined"
label="First Name"
className={classes.formControl}
name="FirstName" />
</Grid>
<Grid item>
<Field
disabled={false}
component={TextField}
data-id="LastName"
variant="outlined"
label="Last Name"
className={classes.formControl}
name="LastName" />
</Grid>
<Grid item>
<Button type="button" variant="contained" onClick={submitForm}>Save settings</Button>
</Grid>
</Form>
)}
</Formik>
解决方案
推荐阅读
- ruby-on-rails - Rails 5 从表中获取特定字段/值
- docker - 为什么这个 apt-key adv 命令会出错?
- azure - Azure 应用服务 - ASPNETCORE_ENVIRONMENT - 多值问题
- python - 将任意长度列表传递给自定义层的巧妙方法
- c++ - Questions about multithread UDP Client-Server architecture
- javascript - Javascript 中的“TimeEvent”对象是什么?它有哪些方法和属性?
- apache-spark - Spark SQL - 在 SQl Notebook 中声明和使用变量
- c# - 如何将结果保存在执行命令的字符串中
- vb.net - 如何修复循环语句的凯撒密码以进行加密?
- react-native - 反应原生,在屏幕之间移动