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.
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:
const formId = 'my-form-async' const ExternalSubmitButton = () => { const { submit } = Form.useSubmit(formId) const [loading, setLoading] = 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> )