【问题标题】:How to set and get a datepicker value using antd with formik?如何使用 antd 和 formik 设置和获取 datepicker 值?
【发布时间】:2019-07-21 23:53:20
【问题描述】:

这里我用 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 验证。我在提交表单时遇到问题我正在获取所需的 DatePicker 验证,问题是选择 DatePicker 的值我没有获取值并且在提交表单后显示验证消息。

  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 提交表单。为什么我没有获取 datepicker 值以及为什么在选择 datepicker 值后显示验证消息?

 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)

【问题讨论】:

    标签: reactjs gatsby antd formik yup


    【解决方案1】:

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

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

    【讨论】:

    • 我正在使用 SetFieldValue 设置一个值,但我没有得到 datepicker 的值
    • 您对 setFieldValue 函数的使用不正确。将其更改为 onChange={(date, dateString) =&gt; setFieldValue('dateofbirth', dateString)} Here is my result My codesandbox for 。只需检查 datepicker 组件
    • 感谢您提供宝贵的信息。我是这项技术的新手。它在工作吗?现在我开始了解如何设置 DatePicker 的字段值。谢谢
    • 我在这里观察到一个问题,如果我们尝试设置值,在提交后设置值,值也设置不重置,我可以知道它发生的原因吗?如何解决?
    • 抱歉,没听懂您的意思?
    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2019-08-02
    • 1970-01-01
    • 2021-02-10
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多