Reactjs React-TypeScript:多个状态更新,但只应用第一个状态更新

Reactjs React-TypeScript:多个状态更新,但只应用第一个状态更新,reactjs,typescript,Reactjs,Typescript,我在这里做了一个沙盒,当你没有填写任何表单输入时,我希望看到3个错误,但我只得到一个。我不明白为什么 import React, { ChangeEvent, useState } from 'react'; import { Link } from 'react-router-dom'; import loadingImg from '../images/loading.svg'; const Join: React.FC = () => { const [state, setSt

我在这里做了一个沙盒,当你没有填写任何表单输入时,我希望看到3个错误,但我只得到一个。我不明白为什么

import React, { ChangeEvent, useState } from 'react';
import { Link } from 'react-router-dom';
import loadingImg from '../images/loading.svg';

const Join: React.FC = () => {
  const [state, setState] = useState({
    email: '',
    emailError: '',
    fullName: '',
    fullNameError: '',
    loading: false,
    password: '',
    passwordError: '',
  });
  const {
    email,
    emailError,
    fullName,
    fullNameError,
    password,
    passwordError,
  } = state;

  const onChange = (event: ChangeEvent<HTMLInputElement>) => {
    event.persist();
    setState((prev) => ({
      ...prev,
      [event.target.id]: event.target.value,
    }));
  };
  const onSubmit = (event: React.FormEvent) => {
    event.preventDefault();
    if (validate('fullName') && validate('email') && validate('password')) {
      console.log('FIRE FORM');
    }
  };
  const onBlur = (event: ChangeEvent<HTMLInputElement>) => {
    validate(event.target.id);
  };
  const validate = (id: string) => {
    switch (id) {
      case 'fullName':
        if (!/^.{6,7}$/.test(fullName)) {
          setState((prev) => ({ ...prev, fullNameError: 'err' }));
          return false;
        } else {
          setState((prev) => ({ ...prev, fullNameError: '' }));
          return true;
        }
        break;
      case 'email':
        if (!/\S+@\S+\.\S+/.test(email)) {
          setState((prev) => ({ ...prev, emailError: 'err' }));
          return false;
        } else {
          setState((prev) => ({ ...prev, emailError: '' }));
          return true;
        }
        break;
      default:
        if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/.test(password)) {
          setState((prev) => ({ ...prev, passwordError: 'err' }));
          return false;
        } else {
          setState((prev) => ({ ...prev, passwordError: '' }));
          return true;
        }
    }
  };

  return (
    <div className='join'>
      <h2>JOIN</h2>
      <h3>some subheading</h3>
      <form onSubmit={onSubmit}>
        <label>Name</label>
        <input
          type='text'
          placeholder='Full name'
          id='fullName'
          value={fullName}
          onChange={onChange}
          onBlur={onBlur}
        />
        {fullNameError}
        <label>Email</label>
        <input
          type='text'
          placeholder='Email address'
          id='email'
          value={email}
          onChange={onChange}
          onBlur={onBlur}
        />
        {emailError}
        <label>Password</label>
        <input
          type='password'
          placeholder='Create a password'
          id='password'
          value={password}
          onChange={onChange}
          onBlur={onBlur}
        />
        {passwordError}
        <button color='primary'>
          {!state.loading ? (
            'Join Now'
          ) : (
            <img src={loadingImg} alt='loadingd' className='loading' />
          )}
        </button>
        <div className='join--terms'>
          By joining, you agree to our
          <Link to={{ pathname: '/terms' }}> Terms of Service</Link> and
          <Link to={{ pathname: '/terms' }}> Privacy Policy</Link>
        </div>
      </form>
    </div>
  );
};

export { Join };

import React,{ChangeEvent,useState}来自“React”;
从'react router dom'导入{Link};
从“../images/loading.svg”导入loadingImg;
const Join:React.FC=()=>{
常量[状态,设置状态]=使用状态({
电子邮件:“”,
电子邮件错误:“”,
全名:“”,
fullNameError:“”,
加载:false,
密码:“”,
密码错误:“”,
});
常数{
电子邮件,
电子邮件错误,
全名,
全名错误,
密码,
密码错误,
}=国家;
const onChange=(事件:ChangeEvent)=>{
event.persist();
设置状态((上一个)=>({
…上一页,
[event.target.id]:event.target.value,
}));
};
const onSubmit=(事件:React.FormEvent)=>{
event.preventDefault();
if(验证('fullName')&&validate('email')&&validate('password')){
控制台日志(“火灾表格”);
}
};
const onBlur=(事件:ChangeEvent)=>{
验证(event.target.id);
};
const validate=(id:string)=>{
开关(id){
案例“全名”:
if(!/^.{6,7}$/.test(全名)){
setState((prev)=>({…prev,fullNameError:'err'}));
返回false;
}否则{
setState((prev)=>({…prev,fullNameError:'}));
返回true;
}
打破
“电子邮件”案例:
如果(!/\S+@\S+\.\S+/.test(电子邮件)){
setState((prev)=>({…prev,emailError:'err'}));
返回false;
}否则{
setState((prev)=>({…prev,emailError:'}));
返回true;
}
打破
违约:
如果(!/^(?=.[a-z])(?=.[a-z])(?=.*\d)[a-zA-z\d]{8,}$/.test(密码)){
setState((prev)=>({…prev,passwordError:'err'}));
返回false;
}否则{
setState((prev)=>({…prev,密码错误:“”});
返回true;
}
}
};
返回(
参加
一些副标题
名称
{fullNameError}
电子邮件
{emailError}
密码
{passwordError}
{!州政府,装货(
“现在加入”
) : (
)}
通过加入,您同意我们的
服务条款及
隐私政策
);
};
导出{Join};

当第一个条件为false时,您的条件不会被评估

所以你最好做点像这样的事

 const onSubmit = (event: React.FormEvent) => {
    event.preventDefault();
    const fullNameValidation =  validate('fullName')
    const emailValidation = validate('email')
    const passwordValidation = validate('password')
    if (fullNameValidation  && emailValidation && passwordValidation) {
      console.log('FIRE FORM');
    }
  };