Remix Validated Form

Supporting users without JS

This library will support the no-JS use case as long as Remix does. However, the way you go about doing this may vary depending on how important this is to you.

If supporting users without JS is important for you

You should fall back to native browser validation when JS is disabled. This is more work to maintain, but it's a better experience for users.

In order to do this properly, you can pass noValidate to your ValidatedForm when JS is available. A helpful tool for doing that is useHydrated from remix-utils.

const isHydrated = useHydrated();
return <ValidatedForm noValidate={isHydrated} />;

This will allow remix-validated-form to take over validation when it can, but will fall back to native browser validation when it can't.

If users without JS are an edge-case

The primary mechanism remix-validated-form has for supporting users without JS is the second argument of the validationError helper. This does come with some caveats, which you can read more about in the validationError docs.

Most of the time your code will look like this:

const action = async ({ request }: DataFunctionArgs) => {
  const result = await validator.validate(
    await request.formData()
  if (result.error)
    return validationError(
  // do something with

Other Considerations

Using fields outside of a ValidatedForm component

If you're using fields outside of the ValidatedForm component, the default values may not correctly populate. To set default values in a way that works without JS, use setFormDefaults.