Submit Button
Form submission button that automatically manages loading and disabled states based on form validation and submission status.
npx shadcn@latest add https://shuip.plvo.dev/r/tsf-submit-button.json
Preview
Loading...
Submit buttons need to prevent double submissions and show loading feedback. SubmitButton subscribes to the form's state via form.Subscribe to track isSubmitting and canSubmit, automatically disabling the button when the form is invalid or already submitting.
The component displays a Loader2Icon spinner when isSubmitting is true, providing visual feedback without manual state management. It accepts a props parameter for Button variants (outline, destructive, etc.) and all native button attributes.
Built-in features
- Auto-disabled when
!canSubmitorisSubmitting - Loading spinner via
Loader2Iconduring submission - Form subscription tracks state with zero boilerplate
- Button variants via
props.variantandprops.size
Usage with validation
const form = useForm({defaultValues: { email: '' },onSubmit: async ({ value }) => {await saveData(value)}})<InputFieldform={form}name='email'label='Email'formProps={{validators: {onChange: ({ value }) => !value.includes('@') ? 'Invalid' : undefined}}}/>{/* Button disabled until email is valid */}<SubmitButton form={form}>Submit</SubmitButton>
Custom variants
<SubmitButton form={form} props={{ variant: 'outline' }}>Save Draft</SubmitButton><SubmitButton form={form} props={{ variant: 'destructive', size: 'lg' }}>Delete Account</SubmitButton>
Examples
Default
Loading...
Props
| Name | Type | Description |
|---|---|---|
| form | ReactFormApi<TFormData> | Form instance from useForm hook (required) |
| children | React.ReactNode? | Button label or content (default: "Submit") |
| props | ButtonProps? | Button props including variant, size, className, and all native button attributes |