3

Use react-hook-form version 7.11.1.

I have a simple control which is expected to show multiple error messages per one validation rule when it is invalid. When I register this control I provide an "validate" option with a custom validation function. From validate option contract I see that my custom validation function should return ValidateResult type. This type can be: Message | Message[] | boolean | undefined (where Message is string). So I assume that I can return array of error messages if control is invalid. But if I return not a string but array, I can't access my error messages anywhere: formState.errors.filedName.mesage is empty.

Is there any way to use array of error messages to show them all in the interface?

My simple component is below:

export const ControlWithErrorsExample = () => {
    const {
        register,
        formState: { errors },
    } = useForm({
        mode: 'onChange',
    });

    const { testValue: testValueError } = errors;

    const validateField = (v: string): ValidateResult => {
        if (v.length > 3) {
            return ['Incorrect value', 'Max length should be equal or less than 3'];
        }

        return undefined;
    };

    useEffect(() => {
        console.log(`I need to get access to my error messages array but got: ${testValueError?.message}`);
    }, [testValueError]);

    return <input type="text" {...register('testValue', { validate: (v) => validateField(v) })} />;
};
1

1 Answer 1

2

You can't achieve your needs with the validate function.

Why Message[]?
This typing is used by resolvers, resolver is the only way to achieve your needs. You can build your own or use ours: https://github.com/react-hook-form/resolvers

Here is a sample of an array of messages:

"birthYear": Object {
  "message": "Expected number, received string",
  "ref": undefined,
  "type": "invalid_type",
  "types": Object {
    "invalid_type": Array [
      "Expected number, received string",
      "Expected undefined, received string",
    ],
    "invalid_union": "Invalid input",
  },
},

👉🏻 Sample from the Zod snapshot

One more thing, to have all errors, you should use criteriaMode: 'all' with useForm

👉🏻 https://react-hook-form.com/api/useform

Feel free to open a RFC: https://github.com/react-hook-form/react-hook-form/discussions

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.