Submit and reset
Submit ans submit error
With the onSubmit parameter
You can listen to the form being submitted with the onSubmit parameter you can provide on both the useForm hook or the <Form> component:
import type { FormEvent } from 'react';
import type { IProps } from '../types';
import { type IFormValues, useForm } from '@per-form/react';
export default function Demo(props: IProps) {
function handleSubmit(_e: FormEvent<HTMLFormElement>, values: IFormValues) {
console.log(values);
}
const { errors, formProps } = useForm({
...props,
onSubmit: handleSubmit,
});
return (
<form {...formProps}>
<input name="text" required />
{errors.all.text && <div className="error">{errors.all.text}</div>}
<button type="submit">Submit</button>
</form>
);
}
Submit error with the onSubmitError parameter
This option only works when useNativeValidation is set to false.
You can get the form error using the onSubmitError parameter:
import type { FormEvent } from 'react';
import type { IProps } from '../types';
import { type IError, type IFormValues, useForm } from '@per-form/react';
export default function Demo(props: IProps) {
function handleSubmit(_e: FormEvent<HTMLFormElement>, values: IFormValues) {
console.log(values);
}
function handleSubmitError(_e: FormEvent<HTMLFormElement>, errors: IError) {
console.log(errors);
}
const { errors, formProps } = useForm({
...props,
onSubmit: handleSubmit,
onSubmitError: handleSubmitError,
});
return (
<form {...formProps}>
<input name="text" required />
{errors.all.text && <div className="error">{errors.all.text}</div>}
<button type="submit">Submit</button>
</form>
);
}
Open the console to see the logs.
Using the onSubmit handler
For the hook version you can also use the onSubmit handler if you prefer.
You can also provide a second parameter for the submit error callback (that again only works with non native validation) :
import type { FormEvent } from 'react';
import type { IProps } from '../types';
import { type IError, type IFormValues, useForm } from '@per-form/react';
export default function Demo(props: IProps) {
function handleSubmit(_e: FormEvent<HTMLFormElement>, values: IFormValues) {
console.log(values);
}
function handleSubmitError(_e: FormEvent<HTMLFormElement>, errors: IError) {
console.log(errors);
}
const { errors, formProps, onSubmit } = useForm(props);
return (
<form {...formProps} onSubmit={onSubmit(handleSubmit, handleSubmitError)}>
<input name="text" required />
{errors.all.text && <div className="error">{errors.all.text}</div>}
<button type="submit">Submit</button>
</form>
);
}
Reset
With a button
If you want to reset you form using a button just add a <button type="reset"> to your form :
import type { FormEvent } from 'react';
import type { IProps } from '../types';
import { type IFormValues, useForm } from '@per-form/react';
export default function Demo(props: IProps) {
function handleSubmit(_e: FormEvent<HTMLFormElement>, values: IFormValues) {
console.log(values);
}
const { errors, formProps } = useForm({
...props,
onSubmit: handleSubmit,
});
return (
<form {...formProps}>
<input name="text" required />
{errors.all.text && <div className="error">{errors.all.text}</div>}
<div className="actions">
<button type="submit">Submit</button>
<button type="reset">Reset</button>
</div>
</form>
);
}
The reset action will clear all values and will reset all errors.
For controlled component see the dedicated chapter.
Programmatically
If you want to reset the form programmatically (for example when the form is submitted), then use the reset function.
You can get the reset function from the useForm hook, but it is also provided as the third parameter of your submit handler:
import type { FormEvent } from 'react';
import type { IProps } from '../types';
import { type IFormValues, useForm } from '@per-form/react';
export default function Demo(props: IProps) {
function handleSubmit(_e: FormEvent<HTMLFormElement>, values: IFormValues) {
reset();
console.log(values);
}
const { errors, formProps, reset } = useForm({
...props,
onSubmit: handleSubmit,
});
return (
<form {...formProps}>
<input name="text" required />
{errors.all.text && <div className="error">{errors.all.text}</div>}
<button type="submit">Submit</button>
</form>
);
}
You can also pass an object parameter to the reset function to programmatically reset the form to specific values.
Resetting to specific values
If you want to reset your form to specific values you can use the defaultValues parameter to set some value initially on the form and then reset the form using those values again (see default values for more information).
But if you don't want those value initially, you can reset the form to some specific values with one of the following techniques.
Even if you don't return anything from your onReset callbacks, it can still be useful to react to the reset event.
For example if you want to update the state of a controlled component (see controlled components for more information).
With the onReset parameter
Return an object from the onReset function parameter:
import type { FormEvent } from 'react';
import type { IProps } from '../types';
import { type IFormValues, useForm } from '@per-form/react';
export default function Demo(props: IProps) {
function handleReset(_e: FormEvent<HTMLFormElement>, _values: IFormValues) {
return { text: 'reset value' };
}
function handleSubmit(_e: FormEvent<HTMLFormElement>, values: IFormValues) {
console.log(values);
}
const { errors, formProps } = useForm({
...props,
onReset: handleReset,
onSubmit: handleSubmit,
});
return (
<form {...formProps}>
<input name="text" required />
{errors.all.text && <div className="error">{errors.all.text}</div>}
<div className="actions">
<button type="submit">Submit</button>
<button type="reset">Reset</button>
</div>
</form>
);
}
With the onReset handler
For the hook version you can also use the onReset handler if you prefer:
import type { FormEvent } from 'react';
import type { IProps } from '../types';
import { type IFormValues, useForm } from '@per-form/react';
export default function Demo(props: IProps) {
function handleReset(_e: FormEvent<HTMLFormElement>, _values: IFormValues) {
return { text: 'reset value' };
}
function handleSubmit(_e: FormEvent<HTMLFormElement>, values: IFormValues) {
console.log(values);
}
const { errors, formProps, onReset, onSubmit } = useForm(props);
return (
<form
{...formProps}
onReset={onReset(handleReset)}
onSubmit={onSubmit(handleSubmit)}
>
<input name="text" required />
{errors.all.text && <div className="error">{errors.all.text}</div>}
<div className="actions">
<button type="submit">Submit</button>
<button type="reset">Reset</button>
</div>
</form>
);
}