Capítulo 17 de 29
form.handleSubmit() triggers validation-then-onSubmit; passing extra context through submission (e.g. "which button was clicked") goes through onSubmitMeta + a per-call metadata argument, keeping onSubmit itself focused purely on already-validated values.
onSubmitMeta on useForm declares the default shape/value of metadata; handleSubmit(customMeta) overrides it for that specific call.handleSubmit() is called with no argument, the onSubmitMeta default is used — callers never need to pass metadata just to satisfy the type.onSubmit to get the transformed value.const form = useForm({
defaultValues: { data: '' },
onSubmitMeta: { submitAction: null },
onSubmit: async ({ value, meta }) => {
console.log(`Action: ${meta.submitAction}`, value)
},
})
<button onClick={() => form.handleSubmit({ submitAction: 'continue' })}>Continue</button>
<button onClick={() => form.handleSubmit({ submitAction: 'backToMenu' })}>Back</button>
onSubmit, disambiguated by meta.submitAction — one validation pipeline, multiple submission intents.onSubmitMeta + per-call metadata for "which action triggered this submit," instead of maintaining separate onSubmit handlers per button.value inside onSubmit — re-parse there if you need it.form.handleSubmit() always runs validation first; it won't call onSubmit on an invalid form (see onSubmitInvalid, ch019 Focus Management, for handling the failure path).form.handleSubmit().onSubmitInvalid, the failure-path counterpart.