If true, the form control will be disabled. This has 2 side effects:
- The FormLabel will have `data-disabled` attribute
- The form element (e.g, Input) will be disabled
Form Control
Form Control provides context such as `isInvalid`, `isDisabled`, and `isRequired` to form elements
Import#
Chakra UI exports 4 components for Form Control:
FormControl: The wrapper that provides context and functionality for all children.FormLabel: The label of a form section. The usage is similar to html label.htmlForis set by default for children input.FormHelperText: The message that tells users more details about the form section.FormErrorMessage: The message that shows up when an error occurs.
import { FormControl, FormLabel, FormErrorMessage, FormHelperText } from '@chakra-ui/react'
Usage#
<FormControl><FormLabel>Email address</FormLabel><Input type="email" /><FormHelperText>We'll never share your email.</FormHelperText></FormControl>
Sample usage for a radio or checkbox group#
<FormControl as="fieldset"><FormLabel as="legend">Favorite Naruto Character</FormLabel><RadioGroup defaultValue="Itachi"><HStack spacing="24px"><Radio value="Sasuke">Sasuke</Radio><Radio value="Nagato">Nagato</Radio><Radio value="Itachi">Itachi</Radio><Radio value="Sage of the six Paths">Sage of the six Paths</Radio></HStack></RadioGroup><FormHelperText>Select only if you're a fan.</FormHelperText></FormControl>
Error message#
FormErrorMessage will only show up when the property isInvalid in
FormControl is true.
function errorMessageExample() {const [input, setInput] = useState('')const handleInputChange = e => setInput(e.target.value)const isError = input === ''return (<FormControl isInvalid={isError}><FormLabel>Email</FormLabel><Input type="email" value={input} onChange={handleInputChange} />{!isError ? (<FormHelperText>Enter the email you'd like to receive the newsletter on.</FormHelperText>) : (<FormErrorMessage>Email is required.</FormErrorMessage>)}</FormControl>)}
Making a field required#
By passing the isRequired props, the Input field has aria-required set to
true, and the FormLabel will show a red asterisk. This red asterisk can be
overwritten by passing requiredIndicator to the FormLabel. If you want to
indicate that a field is optional you can add optionalIndicator to the
FormLabel
<FormControl isRequired><FormLabel>First name</FormLabel><Input placeholder="First name" /></FormControl>
Select Example#
<FormControl><FormLabel>Country</FormLabel><Select placeholder="Select country"><option>United Arab Emirates</option><option>Nigeria</option></Select></FormControl>
Number Input Example#
<FormControl><FormLabel>Amount</FormLabel><NumberInput max={50} min={10}><NumberInputField /><NumberInputStepper><NumberIncrementStepper /><NumberDecrementStepper /></NumberInputStepper></NumberInput></FormControl>
Usage with Form Libraries#
Form Libraries like Formik make it soooo easy to manage form state and validation. I 💖 Formik
// The below import defines which components come from formik// import { Field, Form, Formik } from 'formik';function FormikExample() {function validateName(value) {let errorif (!value) {error = 'Name is required'} else if (value.toLowerCase() !== 'naruto') {error = "Jeez! You're not a fan 😱"}return error}return (<FormikinitialValues={{ name: 'Sasuke' }}onSubmit={(values, actions) => {setTimeout(() => {alert(JSON.stringify(values, null, 2))actions.setSubmitting(false)}, 1000)}}>{props => (<Form><Field name="name" validate={validateName}>{({ field, form }) => (<FormControl isInvalid={form.errors.name && form.touched.name}><FormLabel>First name</FormLabel><Input {...field} placeholder="name" /><FormErrorMessage>{form.errors.name}</FormErrorMessage></FormControl>)}</Field><Button mt={4} colorScheme="teal" isLoading={props.isSubmitting} type="submit">Submit</Button></Form>)}</Formik>)}
Improvements from v1#
-
We've improved the accessibility of the
FormControlcomponent. Here are the changes:idpassed to the form control will be passed to the form input directly.FormLabelwill havehtmlForthat points to theidof the form input.FormErrorMessageaddsaria-describedbyandaria-invalidpointing to the form input.FormHelperTextadds/extendsaria-describedbypointing to the form input.isDisabled,isRequired,isReadOnlyprops passed toFormControlwill cascade across all related components.
-
FormLabelis now aware of thedisabled,focusedanderrorstate of the form input. This helps you style the label accordingly using the_disabled,_focus, and_invalidstyle props. -
If you render
FormErrorMessageandisInvalidisfalseorundefined,FormErrorMessagewon't be visible. The only way to make it visible is by passingisInvalidand setting it totrue. -
You can still supply an
idprop toFormControlthat will override the randomly generatedidand attach to theforattribute of the label and theidof the form element. (It also affects theidattribute of the label) -
The combination of
htmlForandidare optional in which adding both will also override the generatedidsent to the provider.
Props#
isDisabled
isDisabledbooleanisInvalid
isInvalidIf true, the form control will be invalid. This has 2 side effects:
- The FormLabel and FormErrorIcon will have `data-invalid` set to true
- The form element (e.g, Input) will have `aria-invalid` set to true
booleanisReadOnly
isReadOnlyIf true, the form control will be readonly
booleanisRequired
isRequiredIf true, the form control will be required. This has 2 side effects:
- The FormLabel will show a required indicator
- The form element (e.g, Input) will have `aria-required` set to true
booleanlabel
labelThe label text used to inform users as to what information is requested for a text field.
string