Skip to content

ErrorMessage

Render validation error messages for a field.

</> ErrorMessage: Component Since v7.88.0

A simple component to render associated input's error message. Reads from the control prop when supplied, otherwise from the nearest FormProvider.

Props


NameTypeRequiredDescription
namestringName of the field, or a global error path (root or root.*).
controlControlcontrol object provided by useForm. Optional if you are using FormProvider.
asReact.ElementTypeWrapper component or HTML tag. For example: as="span" or as={Text}
render({ message: string, messages?: Object}) => React.ReactNodeThis is a render prop for rendering error message or messages.

Note: you need to set criteriaMode to 'all' for using messages.
Examples:

Single Error Message

import { useForm, ErrorMessage } from "react-hook-form"
interface FormInputs {
singleErrorInput: string
}
export default function App() {
const { register, control, handleSubmit } = useForm<FormInputs>()
const onSubmit = (data: FormInputs) => console.log(data)
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...register("singleErrorInput", { required: "This is required." })}
/>
<ErrorMessage control={control} name="singleErrorInput" />
<ErrorMessage
control={control}
name="singleErrorInput"
render={({ message }) => <p>{message}</p>}
/>
<input type="submit" />
</form>
)
}
import { useForm, ErrorMessage } from "react-hook-form"
export default function App() {
const { register, control, handleSubmit } = useForm()
const onSubmit = (data) => console.log(data)
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...register("singleErrorInput", { required: "This is required." })}
/>
<ErrorMessage control={control} name="singleErrorInput" />
<ErrorMessage
control={control}
name="singleErrorInput"
render={({ message }) => <p>{message}</p>}
/>
<input type="submit" />
</form>
)
}

Multiple Error Messages

import { useForm, ErrorMessage } from "react-hook-form"
interface FormInputs {
multipleErrorInput: string
}
export default function App() {
const { register, control, handleSubmit } = useForm<FormInputs>({
criteriaMode: "all",
})
const onSubmit = (data: FormInputs) => console.log(data)
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...register("multipleErrorInput", {
required: "This is required.",
pattern: {
value: /\d+/,
message: "This input is number only.",
},
maxLength: {
value: 10,
message: "This input exceed maxLength.",
},
})}
/>
<ErrorMessage
control={control}
name="multipleErrorInput"
render={({ messages }) =>
messages &&
Object.entries(messages).map(([type, message]) => (
<p key={type}>{message}</p>
))
}
/>
<input type="submit" />
</form>
)
}
import { useForm, ErrorMessage } from "react-hook-form"
export default function App() {
const { register, control, handleSubmit } = useForm({
criteriaMode: "all",
})
const onSubmit = (data) => console.log(data)
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...register("multipleErrorInput", {
required: "This is required.",
pattern: {
value: /\d+/,
message: "This input is number only.",
},
maxLength: {
value: 10,
message: "This input exceed maxLength.",
},
})}
/>
<ErrorMessage
control={control}
name="multipleErrorInput"
render={({ messages }) =>
messages &&
Object.entries(messages).map(([type, message]) => (
<p key={type}>{message}</p>
))
}
/>
<input type="submit" />
</form>
)
}

With FormProvider

import { useForm, FormProvider, ErrorMessage } from "react-hook-form"
function Field() {
return <ErrorMessage name="singleErrorInput" />
}
export default function App() {
const methods = useForm()
return (
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit((data) => console.log(data))}>
<input
{...methods.register("singleErrorInput", {
required: "This is required.",
})}
/>
<Field />
<input type="submit" />
</form>
</FormProvider>
)
}

Thank you for your support

If you find React Hook Form to be useful in your project, please consider starring and supporting it.

Edit