【问题标题】:state not updating immediately - updating only on second time - NEXT.JS状态不立即更新 - 仅在第二次更新 - NEXT.JS
【发布时间】:2020-07-13 03:22:34
【问题描述】:

我有一个包含姓名、电子邮件和密码的登录表单。我已经完成了同样的验证。我的要求是,只有在验证成功后才能提交表单。检查下面的代码,

const [error, setError] = useState(false);
const [errorEmail, setEmailError] = useState(false);
const [errorMsg, setMsgState] = useState({
    name : "",
    email : "",
    password : ""
});
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const dispatch = useDispatch();

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

    if (name.trim() === '') {
        setError(true);
        setMsgState(prevState => ({
            ...prevState,
            name: '* Name required'
        }))
    }

    if (email.trim() === '') {
        setError(true);
        setMsgState(prevState => ({
            ...prevState,
            email: '* Email required'
        }))
    }

    if (password.trim() === '') {
        setError(true);
        setMsgState(prevState => ({
            ...prevState,
            password: '* Password required'
        }))
    }

    if (email.trim() !== '') {
        if (!/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[A-Za-z]+$/.test(email)) {
            setEmailError(true);
            setMsgState(prevState => ({
                ...prevState,
                email: '* Enter valid email'
            }))
        }
        else
            setEmailError(false);
    }

    if (!error && !errorEmail) {
        const user = { name, email, password };

        dispatch(authenticate(user));
    }
};

在上面的代码中,当用户第一次点击提交按钮时,会显示验证消息并且表单正在提交。第二次表单不提交,只显示验证消息。 State is not updating immediately。如何更改我的代码以实现这一目标?

【问题讨论】:

    标签: reactjs next.js


    【解决方案1】:

    在 useEffect 钩子中添加错误检查,

    useEffect(()=>{
        if (!error && !errorEmail) {
        const user = { name, email, password };
        dispatch(authenticate(user));
        }
    },[error,errorEmail])
    

    【讨论】:

    • 我建议您使用@hapi/joi 输入验证包,它是最流行的包。如果你想保留这个,你可以做一件事,而不是设置每个错误的状态,只需创建一个新函数并验证你在该函数中的输入,如果所有输入都被验证,validateInput 函数将返回错误消息或成功消息. const [user, setUser ] = useState({name:"", email:"", password:"" }) 只做一种状态。然后在句柄提交方法中,执行let res = validateInput(user)if res === "success" dispatch...else setErrorMessage(response)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2020-04-08
    • 1970-01-01
    • 2018-07-25
    • 2021-11-07
    • 2018-08-05
    相关资源
    最近更新 更多