【问题标题】:How do I prevent this form from being submitted if errors still exist?如果错误仍然存​​在,如何防止提交此表单?
【发布时间】:2021-08-31 18:14:13
【问题描述】:

即使firstNamelastName 字段为空,以下函数始终在组件的第一次渲染时提交表单。

const [formErrors, setFormErrors] = useState({});

const registerUser = () => {
    if (firstName === "") {
      setFormErrors((prev) => {
        return { ...prev, firstName: "Firstname is required!" };
      });
    }

    if (lastName === "") {
      setFormErrors((prev) => {
        return { ...prev, lastName: "Lastname is required!" };
      });
    }

    if (Object.keys(formErrors).length === 0) {
      console.log("Form Submitted");
    } else {
      console.log("Failed");
    }
}

在第一次渲染时,Object.keys(formErrors).length 的值为 0,但是错误显示在屏幕上,奇怪!。

我尝试使用useRef,它有效,但它不会在屏幕上显示错误,因为组件不会使用useRef 重新渲染。

如果错误仍然存​​在,如何防止提交此表单?

谢谢

【问题讨论】:

    标签: reactjs react-native validation react-hooks


    【解决方案1】:

    您的问题是您调用了 set state (formErrors),然后您尝试立即读取它。所以当你设置它时,它还没有更新,你正在读取陈旧的数据。

    要修复它,请在该函数中使用一些局部变量(最初您可能希望使用状态数据对其进行初始化)来跟踪错误,然后在完成后将其置于状态。

    类似的东西

    const registerUser = () => {
    
        let errors = {
            ...formErrors
        }
    
        if (firstName === "") {
            errors.firstName = "Firstname is required!"        
        }
    
        if (lastName === "") {
            errors.lastName = "lastName is required!"    
        }
    
        if (Object.keys(errors).length === 0) {
            console.log("Form Submitted");
        } else {
            console.log("Failed");
        }
    
        setFormErrors(errors)
    }
    

    【讨论】:

    • 感谢回答,能否重构代码。我刚刚做了,我仍然看到同样的问题。
    • @MirStephen 检查一下
    • 非常感谢您的回答。我们了解到,我们不应该尝试在同一个函数中读取和设置状态变量。
    • @MirStephen 有时你可以,例如,如果你调用函数 setState 说两次,但你在这里有一点不同的情况。在if 里面你只是在阅读它,不再设置了
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多