Demos
Submit button outside the form
The submit button is rendered outside Form.Handler and uses Form.useSubmit() to trigger submit. Validation and onSubmit run as when using Form.SubmitButton inside the form.
Code Editor
const formId = 'my-form' const ExternalSubmitButton = () => { const { submit } = Form.useSubmit(formId) return ( <Button onClick={() => submit()}>Submit (outside Form.Handler)</Button> ) } render( <Flex.Stack> <Form.Handler id={formId} onSubmit={(data) => { console.log('Submitted:', data) }} > <Form.Card> <Field.Name.First path="/name" value="John" /> </Form.Card> </Form.Handler> <ExternalSubmitButton /> </Flex.Stack> )
Async submit
The submit() function returns a Promise. You can await it to show loading state or react to the result or errors:
Code Editor
const formId = 'my-form-async' const ExternalSubmitButton = () => { const { submit } = Form.useSubmit(formId) const [loading, setLoading] = React.useState(false) const handleClick = async () => { setLoading(true) try { const result = await submit() console.log('Submit result:', result) } finally { setLoading(false) } } return ( <Button onClick={handleClick} disabled={loading}> {loading ? 'Submitting…' : 'Submit'} </Button> ) } render( <Flex.Stack> <Form.Handler id={formId} onSubmit={async (data) => { await new Promise((r) => setTimeout(r, 1000)) console.log('Submitted:', data) }} > <Form.Card> <Field.Name.First path="/name" value="John" /> </Form.Card> </Form.Handler> <ExternalSubmitButton /> </Flex.Stack> )