【问题标题】:React input value changing from defined to undefined after validation + submission验证+提交后反应输入值从定义变为未定义
【发布时间】:2021-04-14 01:05:17
【问题描述】:

我想在提交之前验证反应表单中的信息。 在这里,我设置了一个自定义反应钩子,我在其中实现了更改处理和表单提交:

import { useState } from 'react';
import Axios from 'axios';

const useForm = (validate) => {

    const [values, setValues] = useState({
        name: '',
        email: '',
        subject: '',
        message: '',
        disabled: null,
        emailSent: null
    });

    // Handles user input data
    const handleChange = (event) => {
        const target = event.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const name = target.name;

        setValues ({
            ...values,
            [name] : value
        });
    }

    const [errors, setErrors] = useState({});

    const [isSending, setIsSending] = useState(false);

    
    const handleSubmit = (event) => {
        event.preventDefault();

        setErrors(validate(values));

        setValues({
            disabled: true
        })

        if (errors.length === 0) {

            setIsSending(true);

            // Sends POST request to the API endpoint with the given data and returns sending status
            Axios.post('http://localhost:3030/email/send', values)
            .then(res => {
                if(res.data.success) {
                    this.setValues({
                        disabled: false,
                        emailSent: true
                    });
                    this.setIsSending(false);
                } else {
                    this.setValues({
                        disabled: false,
                        emailSent: false
                    });
                    this.setIsSending(false);
                } 
            })
            .catch(err => {
                setValues({
                    disabled: false,
                    emailSent: false
                });
                setIsSending(false);
            });
        } else {
            setValues({
                disabled: false
            })
        }
    }

    return { handleChange, handleSubmit, values, errors, isSending };

}

export default useForm;

验证钩子是这样的:

export default function validateInfo(values) {
    let errors = {};

    // Full Name validation
    if (values.name === '') {
        errors.name = 'Name is required';
    }

    // Email validation
    if (values.email === '') {
        errors.email = 'Email address is required';
    } else if (!/\S+@\S+\.\S+/.test(values.email)) {
        errors.email = 'Please enter a valid email address';
    }

    // Subject validation
    if (values.subject === '') {
        errors.subject = 'Subject is required';
    }

    // Message validation
    if (values.message === '') {
        errors.message = 'Please, leave me a message';
    }

    return errors;
}

当我调试应用程序时,我可以看到 FormControl 在单击提交后将值从已定义(默认的“”或任何数据)更改为“未定义”,这意味着组件正在强制输入从受控更改到不受控制,换句话说,它没有保持对字段的控制,它还会重置错误值。

我确定问题出在 handleChange() 上,但对我来说一切都很好,我将非常感谢您的帮助。

【问题讨论】:

    标签: javascript reactjs forms validation react-hooks


    【解决方案1】:

    也许在 handleSubmit 你错过了传播值?

        setValues({
         ...values,
         disabled: true,
        });
    

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 2020-05-31
      • 2020-10-03
      • 2021-04-28
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2014-09-18
      相关资源
      最近更新 更多