Zod
You can find full example at StackBlitz.
Check Zod documentation for more details.
Define a schema:
import z, { object, email, string, boolean } from 'zod'
export const exampleSchema = object({
email: email(),
name: string().min(1, 'Required'),
consent: boolean(),
}).superRefine((values, ctx) => {
if (!values.consent) {
ctx.addIssue({
code: 'custom',
path: ['consent'],
message: 'Please agree'
})
}
})
When using TypeScript, infer form values type from the schema:
export type ExampleFormValues = z.infer<typeof exampleSchema>Connect schema to the form:
import { createForm } from 'solid-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { exampleSchema } from './example_schema'
export const ExampleForm = () => {
const form = createForm({
defaultValues: {
email: '',
name: '',
consent: false
},
resolver: zodResolver(exampleSchema)
})
const { errors, register, handleSubmit } = form
const onSubmit = (values) => {
console.log(values)
}
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('email')} aria-invalid={Boolean(errors.email)} />
{errors.email && <p role="alert">{errors.email.message}</p>}
<input {...register('name')} aria-invalid={Boolean(errors.name)} />
{errors.name && <p role="alert">{errors.name.message}</p>}
<input type="checkbox" {...register('consent')} aria-invalid={Boolean(errors.consent)} />
{errors.consent && <p role="alert">{errors.consent.message}</p>}
<button type="submit">Save</button>
</form>
)
}