如何使用 antd 和 formik 设置和获取日期选择器值?



在这里,我正在使用antd创建日期选择器,并将这个antd日期选择器传递给formik字段。我的日期选择器的示例代码与 antd

import React from "react";
import { Form, DatePicker } from "antd"
import { Field } from "formik";
import moment from 'moment';
const FormItem = Form.Item;
function onChange(date, dateString) {
console.log(date, dateString);
}
const dateFormat = "MM-DD-YYYY"
// Here i am adding antd error message through DateInput
const DateInput = ({
field,
form: { touched, errors },
...props
}) => {
const errorMsg = touched[field.name] && errors[field.name]
const validateStatus = errorMsg ? "error"
: (touched[field.name] && !errors[field.name]) ? "success"
: undefined
return (
<div>
<FormItem 
label={props.label}
help={errorMsg}
validateStatus={validateStatus}
hasFeedback
{...props.formitemlayout}>
<DatePicker onChange={onChange} defaultPickerValue={moment()}/> 
</FormItem>
</div>
)
}
export default DateInput

我正在将此 ant 组件添加到 formik 字段组件,使用 handleSubmit 提交表单并应用 YUP 验证。 我在提交表单时遇到问题 我正在获得所需的日期选择器验证,并且问题是选择日期选择器的值,我没有获得值,并且在提交表单后显示验证消息。

class FormikApollo extends React.Component {
render() {
const { values, handleSubmit, setFieldValue } = this.props
return (
<div align="center">
<Form onSubmit={handleSubmit}>
<Field
name="username"
label="Name"
placeholder="Enter a Name"
component={TextField}
value={values.username}
formitemlayout={formItemLayout}
/>
<Field
name="email"
label="Email"
placeholder="Enter an Email"
component={TextField}
value={values.email}
formitemlayout={formItemLayout}

/>
<Field
name="password"
label="Password"
type="password"
placeholder="Enter a Password"
component={TextField}
formitemlayout={formItemLayout}
/>
<Field
name="dateofbirth"
label="dateOfBirth"
type="date"
component={DateInput}
formitemlayout={formItemLayout}
defaultValue={values.dateofbirth}
format={dateFormat} 
/>

<Button type="primary" htmlType="submit">Submit</Button>
</Form>  
)
}
}

在这里,我通过 Formik 获取值并使用 handleSubmit 提交表单。为什么我没有获取日期选择器值,为什么在选择日期选择器值后显示验证消息?

const FormikApp = (withFormik)({
mapPropsToValues({ username, email, password, dateofbirth }) {
return {
username: username || '',
email: email || '',
password: password || '',
dateofbirth: dateofbirth || ''

}
},
validationSchema: Yup.object().shape({
username: Yup.string()
.min(3, "Username must be above 3 characters")
.required("Username is required"),
email: Yup.string()
.email("Invalid Email !!")
.required("Email is required"),
password: Yup.string()
.min(6, "Password must be above 6 characters")
.required("Password is required"),
dateofbirth: Yup.string().required("Date is required")

}),
handleSubmit(values, { resetForm }) {
resetForm();
console.log(values)
}
})(FormikApollo)

在您的DateInput组件中setFieldValue()尝试使用 Formik 方法设置值,无论它是否有效。我相信你可以通过以下方式提取它:form: { touched, errors, setFieldValue }.

此外,请检查表单中的touched项,并确保更改日期字段的值。

最新更新