【问题标题】:Disabling Submit button on click with useRef (to prevent double clicks) inside a Formik form causes Formik submission to break在 Formik 表单内使用 useRef(以防止双击)单击时禁用提交按钮会导致 Formik 提交中断
【发布时间】:2021-10-13 14:29:17
【问题描述】:

我有一个如下的 Formik 表单,它在其原始实现中运行良好。我必须添加的一项额外功能是,当单击提交按钮时,我必须禁用它,以防止双击。我按照example here 定义了一个按钮上的ref={submitBtnRef}。但是在onClick 中插入此代码后,Formik 不再提交,它只是停止。如果我删除这个新代码,一切正常。没有验证错误;我输出 Formik 的errors,它是空的。也没有控制台错误。

const submitForm = async (formValues) => {
    const url = '/app/submitAgreement';
    let obj = {'formValues': formValues};
    await axios.post(url, obj);
}

// Define a Submit Button Ref for disabling in Submit's onClick() below
let submitBtnRef = useRef();

<Formik 
    enableReinitialize
    validationSchema={mySchema} 
    onSubmit={ (values) => {
        submitForm(values); // Calls submitForm() function if there are no errors
    }}
    initialValues={initialFormValues}
>
    {
        ({handleSubmit, handleChange, handleBlur, setFieldValue, setFieldTouched, values, touched, isValid, errors}) 
        => (

            <Form onSubmit={handleSubmit}> {/* Form starts here */}
            ..
            ..
            <Button type="submit" ref={submitBtnRef}
                    onClick={() => { 
                       // If I remove this Ref-Disable code it works, but I need to disable Submit
                       if(submitBtnRef.current) {
                          submitBtnRef.current.setAttribute("disabled", "disabled");
                       }
            
                       // The default form-submit method specified in the Formik Form, submitForm(),
                       // will now be executed if there are no validation errors
                       }} 
    >Submit</Button>                
    ..
    </Form>

【问题讨论】:

    标签: reactjs formik


    【解决方案1】:

    不要直接操作 DOM。您提供的链接已过时,并且包含一些误导性信息。相反,在 JSX 中设置属性 disabled。您可以简单地使用 Formik 的 isSubmitting 值:

    const submitForm = async (formValues) => {
        const url = '/app/submitAgreement';
        let obj = {'formValues': formValues};
        await axios.post(url, obj);
    }
    
    <Formik 
        enableReinitialize
        validationSchema={mySchema} 
        onSubmit={ (values) => {
            submitForm(values); // Calls submitForm() function if there are no errors
        }}
        initialValues={initialFormValues}
    >
        {
            ({handleSubmit, handleChange, handleBlur, setFieldValue, setFieldTouched, values, touched, isValid, errors, isSubmitting}) 
            => (
    
                <Form onSubmit={handleSubmit}> {/* Form starts here */}
                ..
                ..
                <Button type="submit" disabled={isSubmitting}
        >Submit</Button>                
        ..
        </Form>
    

    如果您希望按钮保持禁用状态:

    const [isSubmitted, setIsSubmitted] = useState(false);
    
    //...
    
    const submitForm = async (formValues) => {
        const url = '/app/submitAgreement';
        let obj = {'formValues': formValues};
        await axios.post(url, obj);
        setIsSubmitted(true);
    }
    
    //...
    <Button type="submit" disabled={isSubmitting || isSubmitted}
    
    

    【讨论】:

    • 是的,disabled={isSubmitting} 工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多