Skip to main content

Chakra UI

All Chakra UI form components are React Happy Form standard form component, so we don't need to do any adaptations!

Example​

Here is an example for how to use React Happy Form with Chakra UI.

import { useForm, native, FormErrors } from 'react-happy-form';
import {
Box,
Button,
FormControl,
FormLabel,
FormErrorMessage,
Input,
VStack,
Text,
RadioGroup,
HStack,
Radio,
} from '@chakra-ui/react';

type FormValues = {
firstName?: string;
lastName?: string;
email?: string;
gender?: 'male' | 'female';
};

export const App = () => {
const { field, submit, hasError, getError } = useForm<FormValues>({
onSubmit: (values: FormValues) => {
alert(JSON.stringify(values));
},
onValidate: (values: FormValues) => {
const formErrors: FormErrors<FormValues> = new Map();
if (!values.firstName) {
formErrors.set('firstName', 'First name is required');
}
if (!values.lastName) {
formErrors.set('lastName', 'Last name is required');
}
if (!values.email) {
formErrors.set('email', 'Email is required');
}
if (!values.gender) {
formErrors.set('gender', 'Gender is required');
}
return formErrors;
},
isValidateOnTouched: true,
isFocusOnValidateFailed: true,
});

return (
<Box p="4">
<Text fontSize="xl" fontWeight="bold" textAlign="center">
Charkra UI - React Happy Form
</Text>
<form onSubmit={submit}>
<VStack spacing={4} align="flex-start">
<FormControl isInvalid={hasError('firstName')}>
<FormLabel htmlFor="firstName">First Name</FormLabel>
<Input id="firstName" {...native(field('firstName'))} />
<FormErrorMessage>{getError('firstName')}</FormErrorMessage>
</FormControl>
<FormControl isInvalid={hasError('lastName')}>
<FormLabel htmlFor="lastName">Last Name</FormLabel>
<Input id="lastName" {...native(field('lastName'))} />
<FormErrorMessage>{getError('lastName')}</FormErrorMessage>
</FormControl>
<FormControl isInvalid={hasError('email')}>
<FormLabel htmlFor="email">Email</FormLabel>
<Input id="email" {...native(field('email'))} />
<FormErrorMessage>{getError('email')}</FormErrorMessage>
</FormControl>
<FormControl isInvalid={hasError('gender')}>
<FormLabel htmlFor="gender">Gender</FormLabel>
<RadioGroup {...field('gender')}>
<HStack spacing={4}>
<Radio value="male">Male</Radio>
<Radio value="female">Female</Radio>
</HStack>
</RadioGroup>
<FormErrorMessage>{getError('gender')}</FormErrorMessage>
</FormControl>
<Button type="submit" colorScheme="green" width="full">
Submit
</Button>
</VStack>
</form>
</Box>
);
};

Edit on CodeSandbox