Formulários de desempenho, flexível e extensível com validação fácil de usar.
npm install @hookform/resolvers
ValueCheck
TypeCompiler
type Options = {
mode: 'async' | 'sync',
raw?: boolean
}
resolver(schema: object, schemaOptions?: object, resolverOptions: Options)
tipo | Obrigatório | Descrição | |
---|---|---|---|
esquema | object | ✓ | Esquema de validação |
Esquemaoptions | object | Opções de esquema da biblioteca de validação | |
SOFRESOPROÇÕES | object | Opções de resolver, async é o modo padrão |
Validação de esquema de objeto simples morto.
import { useForm } from 'react-hook-form' ;
import { yupResolver } from '@hookform/resolvers/yup' ;
import * as yup from 'yup' ;
const schema = yup
. object ( )
. shape ( {
name : yup . string ( ) . required ( ) ,
age : yup . number ( ) . required ( ) ,
} )
. required ( ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : yupResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'name' ) } / >
< input type = "number" { ... register ( 'age' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
Validação de esquema com TypeScript-primeiro
️ O exemplo abaixo usa ovalueAsNumber
, que requerreact-hook-form
v6.12.0 (lançado em 28 de novembro de 2020) ou posterior.
import { useForm } from 'react-hook-form' ;
import { zodResolver } from '@hookform/resolvers/zod' ;
import * as z from 'zod' ;
const schema = z . object ( {
name : z . string ( ) . min ( 1 , { message : 'Required' } ) ,
age : z . number ( ) . min ( 10 ) ,
} ) ;
const App = ( ) => {
const {
register ,
handleSubmit ,
formState : { errors } ,
} = useForm ( {
resolver : zodResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'name' ) } / >
{ errors . name ?. message && < p > { errors . name ?. message } < / p > }
< input type = "number" { ... register ( 'age' , { valueAsNumber : true } ) } / >
{ errors . age ?. message && < p > { errors . age ?. message } < / p > }
< input type = "submit" / >
< / form >
) ;
} ;
Uma maneira simples e composta de validar dados em JavaScript (ou TypeScript).
import { useForm } from 'react-hook-form' ;
import { superstructResolver } from '@hookform/resolvers/superstruct' ;
import { object , string , number } from 'superstruct' ;
const schema = object ( {
name : string ( ) ,
age : number ( ) ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : superstructResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'name' ) } / >
< input type = "number" { ... register ( 'age' , { valueAsNumber : true } ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
A biblioteca de validação de dados mais poderosa para JS.
import { useForm } from 'react-hook-form' ;
import { joiResolver } from '@hookform/resolvers/joi' ;
import Joi from 'joi' ;
const schema = Joi . object ( {
name : Joi . string ( ) . required ( ) ,
age : Joi . number ( ) . required ( ) ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : joiResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'name' ) } / >
< input type = "number" { ... register ( 'age' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
Colete? Teste de validação declarativa.
import { useForm } from 'react-hook-form' ;
import { vestResolver } from '@hookform/resolvers/vest' ;
import { create , test , enforce } from 'vest' ;
const validationSuite = create ( ( data = { } ) => {
test ( 'username' , 'Username is required' , ( ) => {
enforce ( data . username ) . isNotEmpty ( ) ;
} ) ;
test ( 'password' , 'Password is required' , ( ) => {
enforce ( data . password ) . isNotEmpty ( ) ;
} ) ;
} ) ;
const App = ( ) => {
const { register , handleSubmit , errors } = useForm ( {
resolver : vestResolver ( validationSuite ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( data ) => console . log ( data ) ) } >
< input { ... register ( 'username' ) } / >
< input type = "password" { ... register ( 'password' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
Validação de propriedade baseada em decoradores para aulas.
️ Lembre -se de adicionar essas opções ao seutsconfig.json
!
"strictPropertyInitialization": false,
"experimentalDecorators": true
import { useForm } from 'react-hook-form' ;
import { classValidatorResolver } from '@hookform/resolvers/class-validator' ;
import { Length , Min , IsEmail } from 'class-validator' ;
class User {
@ Length ( 2 , 30 )
username : string ;
@ IsEmail ( )
email : string ;
}
const resolver = classValidatorResolver ( User ) ;
const App = ( ) => {
const {
register ,
handleSubmit ,
formState : { errors } ,
} = useForm < User > ( { resolver } ) ;
return (
< form onSubmit = { handleSubmit ( ( data ) => console . log ( data ) ) } >
< input type = "text" { ... register ( 'username' ) } / >
{ errors . username && < span > { errors . username . message } < / span > }
< input type = "text" { ... register ( 'email' ) } / >
{ errors . email && < span > { errors . email . message } < / span > }
< input type = "submit" value = "Submit" / >
< / form >
) ;
} ;
Validar seus dados com decodificadores poderosos.
import React from 'react' ;
import { useForm } from 'react-hook-form' ;
import { ioTsResolver } from '@hookform/resolvers/io-ts' ;
import t from 'io-ts' ;
// you don't have to use io-ts-types, but it's very useful
import tt from 'io-ts-types' ;
const schema = t . type ( {
username : t . string ,
age : tt . NumberFromString ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : ioTsResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
< input type = "number" { ... register ( 'age' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
export default App ;
Um validador JS pequeno, simples e rápido
import { useForm } from 'react-hook-form' ;
import { nopeResolver } from '@hookform/resolvers/nope' ;
import Nope from 'nope-validator' ;
const schema = Nope . object ( ) . shape ( {
name : Nope . string ( ) . required ( ) ,
age : Nope . number ( ) . required ( ) ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : nopeResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'name' ) } / >
< input type = "number" { ... register ( 'age' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
Validação de esquema com TypeScript-primeiro
import { useForm } from 'react-hook-form' ;
import { computedTypesResolver } from '@hookform/resolvers/computed-types' ;
import Schema , { number , string } from 'computed-types' ;
const schema = Schema ( {
username : string . min ( 1 ) . error ( 'username field is required' ) ,
age : number ,
} ) ;
const App = ( ) => {
const {
register ,
handleSubmit ,
formState : { errors } ,
} = useForm ( {
resolver : computedTypesResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'name' ) } / >
{ errors . name ?. message && < p > { errors . name ?. message } < / p > }
< input type = "number" { ... register ( 'age' , { valueAsNumber : true } ) } / >
{ errors . age ?. message && < p > { errors . age ?. message } < / p > }
< input type = "submit" / >
< / form >
) ;
} ;
Biblioteca de asserção do tipo estático e de tempo de execução, sem dependências
import { useForm } from 'react-hook-form' ;
import { typanionResolver } from '@hookform/resolvers/typanion' ;
import * as t from 'typanion' ;
const isUser = t . isObject ( {
username : t . applyCascade ( t . isString ( ) , [ t . hasMinLength ( 1 ) ] ) ,
age : t . applyCascade ( t . isNumber ( ) , [
t . isInteger ( ) ,
t . isInInclusiveRange ( 1 , 100 ) ,
] ) ,
} ) ;
const App = ( ) => {
const {
register ,
handleSubmit ,
formState : { errors } ,
} = useForm ( {
resolver : typanionResolver ( isUser ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'name' ) } / >
{ errors . name ?. message && < p > { errors . name ?. message } < / p > }
< input type = "number" { ... register ( 'age' ) } / >
{ errors . age ?. message && < p > { errors . age ?. message } < / p > }
< input type = "submit" / >
< / form >
) ;
} ;
O validador JSON mais rápido para Node.js e navegador
import { useForm } from 'react-hook-form' ;
import { ajvResolver } from '@hookform/resolvers/ajv' ;
// must use `minLength: 1` to implement required field
const schema = {
type : 'object' ,
properties : {
username : {
type : 'string' ,
minLength : 1 ,
errorMessage : { minLength : 'username field is required' } ,
} ,
password : {
type : 'string' ,
minLength : 1 ,
errorMessage : { minLength : 'password field is required' } ,
} ,
} ,
required : [ 'username' , 'password' ] ,
additionalProperties : false ,
} ;
const App = ( ) => {
const {
register ,
handleSubmit ,
formState : { errors } ,
} = useForm ( {
resolver : ajvResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( data ) => console . log ( data ) ) } >
< input { ... register ( 'username' ) } / >
{ errors . username && < span > { errors . username . message } < / span > }
< input { ... register ( 'password' ) } / >
{ errors . password && < span > { errors . password . message } < / span > }
< button type = "submit" > submit < / button >
< / form >
) ;
} ;
JSON Schema Type Builder com resolução do tipo estático para datilografado
ValueCheck
import { useForm } from 'react-hook-form' ;
import { typeboxResolver } from '@hookform/resolvers/typebox' ;
import { Type } from '@sinclair/typebox' ;
const schema = Type . Object ( {
username : Type . String ( { minLength : 1 } ) ,
password : Type . String ( { minLength : 1 } ) ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : typeboxResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
< input type = "password" { ... register ( 'password' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
TypeCompiler
Um jit de alto desempenho do TypeBox
, leia mais
import { useForm } from 'react-hook-form' ;
import { typeboxResolver } from '@hookform/resolvers/typebox' ;
import { Type } from '@sinclair/typebox' ;
import { TypeCompiler } from '@sinclair/typebox/compiler' ;
const schema = Type . Object ( {
username : Type . String ( { minLength : 1 } ) ,
password : Type . String ( { minLength : 1 } ) ,
} ) ;
const typecheck = TypeCompiler . Compile ( schema ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : typeboxResolver ( typecheck ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
< input type = "password" { ... register ( 'password' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
Validador 1: 1 do TypeScript, otimizado do editor ao tempo de execução
import { useForm } from 'react-hook-form' ;
import { arktypeResolver } from '@hookform/resolvers/arktype' ;
import { type } from 'arktype' ;
const schema = type ( {
username : 'string>1' ,
password : 'string>1' ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : arktypeResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
< input type = "password" { ... register ( 'password' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
A biblioteca de esquema Modular e Type Safe para validar dados estruturais
import { useForm } from 'react-hook-form' ;
import { valibotResolver } from '@hookform/resolvers/valibot' ;
import * as v from 'valibot' ;
const schema = v . object ( {
username : v . pipe (
v . string ( 'username is required' ) ,
v . minLength ( 3 , 'Needs to be at least 3 characters' ) ,
v . endsWith ( 'cool' , 'Needs to end with `cool`' ) ,
) ,
password : v . string ( 'password is required' ) ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : valibotResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
< input type = "password" { ... register ( 'password' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
Adaptador universal para validação de esquema, compatível com qualquer biblioteca de validação
import { useForm } from 'react-hook-form' ;
import { typeschemaResolver } from '@hookform/resolvers/typeschema' ;
import * as z from 'zod' ;
// Use your favorite validation library
const schema = z . object ( {
username : z . string ( ) . min ( 1 , { message : 'Required' } ) ,
password : z . number ( ) . min ( 1 , { message : 'Required' } ) ,
} ) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : typeschemaResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
< input type = "password" { ... register ( 'password' ) } / >
< input type = "submit" / >
< / form >
) ;
} ;
Uma poderosa estrutura de texto datilografado que fornece um sistema de efeitos funcionais totalmente de pleno direito com uma rica biblioteca padrão.
import React from 'react' ;
import { useForm } from 'react-hook-form' ;
import { effectTsResolver } from '@hookform/resolvers/effect-ts' ;
import { Schema } from 'effect' ;
const schema = Schema . Struct ( {
username : Schema . String . pipe (
Schema . nonEmpty ( { message : ( ) => 'username required' } ) ,
) ,
password : Schema . String . pipe (
Schema . nonEmpty ( { message : ( ) => 'password required' } ) ,
) ,
} ) ;
type FormData = Schema . Schema . Type < typeof schema > ;
interface Props {
onSubmit : ( data : FormData ) => void ;
}
function TestComponent ( { onSubmit } : Props ) {
const {
register ,
handleSubmit ,
formState : { errors } ,
// provide generic if TS has issues inferring types
} = useForm < FormData > ( {
resolver : effectTsResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( onSubmit ) } >
< input { ... register ( 'username' ) } / >
{ errors . username && < span role = "alert" > { errors . username . message } < / span>}
< input { ... register ( 'password' ) } / >
{ errors . password && < span role = "alert" > { errors . password . message } < / span>}
< button type = "submit" > submit < / button>
< / form >
) ;
}
Vinejs é uma biblioteca de validação de dados do formulário para node.js
import { useForm } from 'react-hook-form' ;
import { vineResolver } from '@hookform/resolvers/vine' ;
import vine from '@vinejs/vine' ;
const schema = vine . compile (
vine . object ( {
username : vine . string ( ) . minLength ( 1 ) ,
password : vine . string ( ) . minLength ( 1 ) ,
} ) ,
) ;
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : vineResolver ( schema ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
{ errors . username && < span role = "alert" > { errors . username . message } < / span>}
< input { ... register ( 'password' ) } / >
{ errors . password && < span role = "alert" > { errors . password . message } < / span>}
< button type = "submit" > submit < / button>
< / form >
) ;
} ;
Uma biblioteca digitada primeiro para construir regras de validação fortemente tipo
import { useForm } from 'react-hook-form' ;
import { fluentValidationResolver } from '@hookform/resolvers/fluentvalidation-ts' ;
import { Validator } from 'fluentvalidation-ts' ;
class FormDataValidator extends Validator < FormData > {
constructor ( ) {
super ( ) ;
this . ruleFor ( 'username' )
. notEmpty ( )
. withMessage ( 'username is a required field' ) ;
this . ruleFor ( 'password' )
. notEmpty ( )
. withMessage ( 'password is a required field' ) ;
}
}
const App = ( ) => {
const { register , handleSubmit } = useForm ( {
resolver : fluentValidationResolver ( new FormDataValidator ( ) ) ,
} ) ;
return (
< form onSubmit = { handleSubmit ( ( d ) => console . log ( d ) ) } >
< input { ... register ( 'username' ) } / >
{ errors . username && < span role = "alert" > { errors . username . message } < / span>}
< input { ... register ( 'password' ) } / >
{ errors . password && < span role = "alert" > { errors . password . message } < / span>}
< button type = "submit" > submit < / button>
< / form >
) ;
} ;
Obrigado a todos os nossos apoiadores! [Torne -se um patrocinador].
Obrigado, vá a essas pessoas maravilhosas! [Torne -se um colaborador].