我使用yup和react表单在react和验证中创建了这个表单组件。我还在表单中创建了一个类似于选项卡的结构,以避免垂直滚动。关于用户如何通过按下next按钮或虚线导航来更改选项卡,有两个选项。问题是,在用户决定单击虚线导航或next按钮而不键入输入字段后,我无法想出如何验证这些输入字段的解决方案。所有验证都是在用户单击submit按钮后完成的。我想要的输出是,如果用户决定单击下一个或虚线导航而不提供数据,表单将触发验证而不按onsubmit。
谢谢!
const schema = yup.object().shape({
projectName: yup.string().required('Please enter project name here'),
projectClient: yup
.string()
.required('Please choose your client for this project'),
});
const createProject = () => {
const [projectInfo, setProjectInfo] = useState({
projectName: '',
projectClientName: '',
});
const { register, errors, handleSubmit } = useForm({
resolver: yupResolver(schema),
mode: 'all',
});
}
const handleOnSubmit = () => {
dispatch(registerProject(projectInfo));
};
return (
<form
className='form-container w-full flex flex-col relative'
onSubmit={handleSubmit(handleOnSubmit)}
>
<div
className={`w-full ${
tabActive === 'Create' ? 'block' : 'hidden'
}`}
>
<div className='relative rounded-tl-lg rounded-tr-lg'>
<h4 className='text-grey text-lg font-bold text-center tracking-wider'>
Create Project
</h4>
<XIcon
className='w-5 h-5 absolute top-0 right-0 opacity-40 cursor-pointer'
aria-hidden='true'
onClick={() => showProjectCreate(false)}
/>
</div>
<div className='pt-10'>
<label className='text-sm font-medium' htmlFor='password'>
Project name
</label>
<div className='mt-2 relative'>
<InputElement
className={`w-full px-4 py-5 text-sm leading-tight rounded-md appearance-none ${
errors.projectName
? 'border-danger focus:border-danger'
: 'border focus:border-primary'
} border focus:border-primary focus:outline-none focus:shadow-outline`}
id='projectName'
name='projectName'
type='text'
placeholder='Enter your project name here'
ref={register}
value={projectInfo.projectName}
onChange={handleOnChange}
/>
<p className='text-xxs text-danger mt-2 absolute'>
{errors.projectName?.message}
</p>
</div>
</div>
<div className='pt-10'>
<label className='text-sm font-medium' htmlFor='projectClientName'>
Project client name
</label>
<div className='mt-2 relative'>
<InputElement
className={`w-full px-4 py-5 text-sm leading-tight rounded-md appearance-none ${
errors.projectName
? 'border-danger focus:border-danger'
: 'border focus:border-primary'
} border focus:border-primary focus:outline-none focus:shadow-outline`}
id='projectClientName'
name='projectClientName'
type='text'
placeholder='Enter your project name here'
ref={register}
value={projectInfo.projectClientName}
onChange={handleOnChange}
/>
<p className='text-xxs text-danger mt-2 absolute'>
{errors.projectName?.message}
</p>
</div>
</div>
</div>
</form>
)
}发布于 2022-01-23 15:29:50
我认为你可以做验证Onblur事件?
https://stackoverflow.com/questions/70823600
复制相似问题