Reactjs React-TypeScript:多个状态更新,但只应用第一个状态更新
我在这里做了一个沙盒,当你没有填写任何表单输入时,我希望看到3个错误,但我只得到一个。我不明白为什么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
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');
}
};