Form

Use the Form to wrap input elements, define a trigger element, and get a top level submit callback.

import { useEffect, useState } from 'react'
import type { SizeTokens } from 'tamagui'
import { Button, Form, H4, Spinner } from 'tamagui'
export function FormsDemo(props: { size: SizeTokens }) {
const [status, setStatus] = useState<'off' | 'submitting' | 'submitted'>('off')
useEffect(() => {
if (status === 'submitting') {
const timer = setTimeout(() => setStatus('off'), 2000)
return () => {
clearTimeout(timer)
}
}
}, [status])
return (
<Form alignItems="center" minWidth={300} gap="$2" onSubmit={() => setStatus('submitting')} borderWidth={1} borderRadius="$4" backgroundColor="$background" borderColor="$borderColor" padding="$8" >
<H4>{status[0].toUpperCase() + status.slice(1)}</H4>
<Form.Trigger asChild disabled={status !== 'off'}>
<Button icon={status === 'submitting' ? () => <Spinner /> : undefined}>
Submit
</Button>
</Form.Trigger>
</Form>
)
}

Features

  • Works on native and web.

  • Outputs accessible forms.

  • Works with every Tamagui prop.

Installation

Form is already installed in tamagui, or you can install it independently:

yarn @tamagui/form

Anatomy

import { Form } from 'tamagui' // or '@tamagui/form'
export default () => (
<Form>
{/* ... */}
<Form.Trigger asChild>
<Button />
</Form.Trigger>
</Form>
)

API Reference

Form

Props

  • onSubmit (required)

    () => void

    Must use Form.Trigger to ensure onSubmit will callback.

  • Form.Trigger

    Wrap this around your submitting element to make the form submit. We recommend using asChild to a child element of your choosing for more control.

    Accepts Tamagui Props.

    Previous

    Checkbox

    Next

    Input & TextArea