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' htmlFor={null}>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 so easy to manage form state and validation.
// 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><Buttonmt={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
isDisabledbooleanfalseisInvalid
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
booleanfalseisReadOnly
isReadOnlyIf true, the form control will be readonly
booleanfalseisRequired
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
booleanfalselabel
labelThe label text used to inform users as to what information is requested for a text field.
string