提交前的 react-hook-form 验证
react-hook-form validation before submission
我有一个表格(抱歉太长了),用户可以很简单地输入姓名、电子邮件、phone、评论:
<form
className={classes.root}
data-testid="getting-started-form"
onSubmit={handleSubmit(onSubmit)}
>
<div style={{ width: '400px' }}>
<div style={{ width: '100%'}}>
<Controller as={<TextField
label="Name"
id="name"
name="name"
type="text"
value={name}
placeholder="Name"
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setName(target.value);
}}
inputProps={{
'data-testid': 'name'
}}
/>} name="name" rules={{ required: true }} control={control}
/>
{errors.name && <span>Name is required</span>}
</div>
<div style={{ width: '100%' }}>
<Controller as={<TextField
label="Email"
id="email"
name="email"
type="text"
value={email}
placeholder="Email"
style={{ width: '100%' }}
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setEmail(target.value);
}}
inputProps={{
'data-testid': 'email'
}}
/>} name="email" rules={{ required: true, pattern: /^\w+[\w-\.]*\@\w+((-\w+)|(\w*))\.[a-z]{2,3}$/i }} control={control}
/>
{errors.email && <span>Email is required</span>}
</div>
<div style={{ width: '30%' }}>
<Controller as={<TextField
label="Phone"
id="phone"
name="phone"
type="text"
value={phone}
placeholder="eg.15556667890"
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setPhone(target.value);
}}
inputProps={{
'data-testid': 'phone'
}}
/>} name="phone" rules={{ pattern: /\d{11}/ }} control={control}
/>
</div>
<div style={{ width: '30%' }}>
<Controller as={<TextField
label="Comments"
id="comments"
name="comments"
type="text"
value={comments}
placeholder="Comments"
rows={6}
multiline
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setComments(target.value);
}}
inputProps={{
'data-testid': 'comments'
}}
/>} name="comments" control={control}
/>
</div>
</div>
<Button
type="submit"
aria-label="submit getting-started-form"
variant="contained"
color="primary"
data-testid="getting-started-form-submit-button"
>
Submit
</Button>
</form>
所有字段在提交时都经过验证。在提交表单之前,有没有办法让 react-hook-forms 进行某种验证?我想要像 Angular 这样的标志,用于表示肮脏、原始等
我没有使用过 react-hook-forms,但我使用过 onblur 事件处理程序在提交之前验证各个字段。
已更新!
验证者 API:https://react-hook-form.com/api/.
您可以选择值 onBlur
而不是默认的 onSubmit
模式。
您可以在此处关注官方文档:https://react-hook-form.com/get-started#Registerfields.
基本上您需要 register
个字段进行验证。然后 react-hook-form
将在提交时自动为您验证。
要在提交之前进行验证,您可以使用 Controller
组件,在内部使用 rules
属性,如下所示:
<Controller
name="name"
control={control}
defaultValue=""
rules={{
required: getRequired(t),
validate: getValidation(t) // <== Here you use validate
}}
render={({ onChange, onBlur, value }) => (
<TextField
error={Boolean(errors?.name)}
helperText={errors?.name?.message}
...
/>
)}
/>
查看 Controller
的官方文档示例
我有一个表格(抱歉太长了),用户可以很简单地输入姓名、电子邮件、phone、评论:
<form
className={classes.root}
data-testid="getting-started-form"
onSubmit={handleSubmit(onSubmit)}
>
<div style={{ width: '400px' }}>
<div style={{ width: '100%'}}>
<Controller as={<TextField
label="Name"
id="name"
name="name"
type="text"
value={name}
placeholder="Name"
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setName(target.value);
}}
inputProps={{
'data-testid': 'name'
}}
/>} name="name" rules={{ required: true }} control={control}
/>
{errors.name && <span>Name is required</span>}
</div>
<div style={{ width: '100%' }}>
<Controller as={<TextField
label="Email"
id="email"
name="email"
type="text"
value={email}
placeholder="Email"
style={{ width: '100%' }}
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setEmail(target.value);
}}
inputProps={{
'data-testid': 'email'
}}
/>} name="email" rules={{ required: true, pattern: /^\w+[\w-\.]*\@\w+((-\w+)|(\w*))\.[a-z]{2,3}$/i }} control={control}
/>
{errors.email && <span>Email is required</span>}
</div>
<div style={{ width: '30%' }}>
<Controller as={<TextField
label="Phone"
id="phone"
name="phone"
type="text"
value={phone}
placeholder="eg.15556667890"
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setPhone(target.value);
}}
inputProps={{
'data-testid': 'phone'
}}
/>} name="phone" rules={{ pattern: /\d{11}/ }} control={control}
/>
</div>
<div style={{ width: '30%' }}>
<Controller as={<TextField
label="Comments"
id="comments"
name="comments"
type="text"
value={comments}
placeholder="Comments"
rows={6}
multiline
onChange={(e: React.FormEvent<EventTarget>) => {
let target = e.target as HTMLInputElement;
setComments(target.value);
}}
inputProps={{
'data-testid': 'comments'
}}
/>} name="comments" control={control}
/>
</div>
</div>
<Button
type="submit"
aria-label="submit getting-started-form"
variant="contained"
color="primary"
data-testid="getting-started-form-submit-button"
>
Submit
</Button>
</form>
所有字段在提交时都经过验证。在提交表单之前,有没有办法让 react-hook-forms 进行某种验证?我想要像 Angular 这样的标志,用于表示肮脏、原始等
我没有使用过 react-hook-forms,但我使用过 onblur 事件处理程序在提交之前验证各个字段。
已更新! 验证者 API:https://react-hook-form.com/api/.
您可以选择值 onBlur
而不是默认的 onSubmit
模式。
您可以在此处关注官方文档:https://react-hook-form.com/get-started#Registerfields.
基本上您需要 register
个字段进行验证。然后 react-hook-form
将在提交时自动为您验证。
要在提交之前进行验证,您可以使用 Controller
组件,在内部使用 rules
属性,如下所示:
<Controller
name="name"
control={control}
defaultValue=""
rules={{
required: getRequired(t),
validate: getValidation(t) // <== Here you use validate
}}
render={({ onChange, onBlur, value }) => (
<TextField
error={Boolean(errors?.name)}
helperText={errors?.name?.message}
...
/>
)}
/>
查看 Controller
的官方文档示例