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

标签 reactjs gatsby antd formik yup

这里我使用 antd 创建 Datepicker 并将这个 antd datepicker 传递给 formik 字段。我使用 antd 的 Datepicker 的示例代码

    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验证。 iam 遇到问题是提交表单 iam 获取了 DatePicker 所需的验证,问题是选择 DatePicker 的值 iam 未获取值并且提交表单后会显示验证消息。

  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>  
 )
   }

}

这里我通过withFormik获取值并使用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 组件中,尝试使用 Formik 的 setFieldValue() 方法设置值,无论它是否有效。我相信您可以通过以下方式提取它: form: { Touched, Errors, setFieldValue }.

另请检查表单中的touched项,并确保您正在更改日期字段的值。

关于reactjs - 如何使用 antd 和 formik 设置和获取日期选择器值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54919371/

相关文章:

javascript - 从 parent 到 child 的 react 事件委托(delegate)

Gatsby项目给出了奇怪的错误,无法构建

javascript - 如何在 ant design 下拉菜单的事件 'triggering' 上应用 mixpanel

html - 如何根据 ANTD 表中选择标签中的值禁用日期选择器

javascript - React 上下文组件渲染

javascript - 嵌套 HTML 元素上的 onKeyDown

javascript - react 路由器 v3 : how to reload page when entering and leaving a specific route

javascript - 类名未定义

javascript - 在 GraphQL 查询模板中使用 React Prop (字符串)

javascript - 从 websocket 数据源读取 JSON 数组