useRadioGroup
useRadioGroup
is a custom hook that provides all the state management logic
for a group of radios.
Import#
import { useRadioGroup } from '@chakra-ui/react'
Return value#
The useRadioGroup
hook returns following props
Name | Type | Description |
---|---|---|
value | StringOrNumber[] | The value of radio group. |
name | string | The name of the radio options. All radio options must use the same name. |
ref | any | The ref of the radio group. |
isDisabled | boolean | A utility to manage disabled state. |
isFocusable | boolean | A utility to manage focused state. |
focus | () => void | A utility function to set the focus on the first enabled radio. |
onChange | (nextValue: EventOrValue) => void | The onChange handler for the radio group. |
setValue | (state: StringOrNumber[]) => void | A function to set the value of the radio group. |
getRadioProps | (props?: Dict) => Dict | A function that takes root props and handles changes for the radio group |
getRootProps | (props?: Dict) => Dict | A function that takes radio root props and handles changes for the radio group |
htmlProps | {} | A function that takes radio root props and handles changes for the radio group |
Usage#
function Example() {function CustomRadio(props) {const { image, ...radioProps } = propsconst { state, getInputProps, getRadioProps, htmlProps, getLabelProps } =useRadio(radioProps)return (<chakra.label {...htmlProps} cursor='pointer'><input {...getInputProps({})} hidden /><Box{...getRadioProps()}bg={state.isChecked ? 'green.200' : 'transparent'}w={12}p={1}rounded='full'><Image src={image} rounded='full' {...getLabelProps()} /></Box></chakra.label>)}const toast = useToast()const avatars = [{ name: 'Kat', image: 'https://randomuser.me/api/portraits/women/44.jpg' },{ name: 'Kevin', image: 'https://randomuser.me/api/portraits/men/86.jpg' },{ name: 'Andy', image: 'https://randomuser.me/api/portraits/men/29.jpg' },{ name: 'Jess', image: 'https://randomuser.me/api/portraits/women/95.jpg' },]const handleChange = (value) => {toast({title: `The value got changed to ${value}!`,status: 'success',duration: 2000,})}const { value, getRadioProps, getRootProps } = useRadioGroup({defaultValue: 'Kevin',onChange: handleChange,})return (<Stack {...getRootProps()}><Text>The selected radio is: {value}</Text><HStack>{avatars.map((avatar) => {return (<CustomRadiokey={avatar.name}image={avatar.image}{...getRadioProps({ value: avatar.name })}/>)})}</HStack></Stack>)}
Using isDisabled
and isFocusable
#
When providing the hook with the isDisabled
and/or isFocusable
props, this
values also need to be returned and passed to the radio inputs.
This is different than simply passing them as props to the RadioGroup
component because the component has access to context to supply the values to
the radio inputs.
Below is an example with isDisabled
being passed to the hook and used with the
Radio
component. If needed, this custom component can than be controllable by
a parent, which would supply the logic to determine if the inputs need to be
disabled.
function CustomRadioGroup(props) {const { options, ...rest } = propsconst { getRootProps, getRadioProps, isDisabled } = useRadioGroup({...rest,})const group = getRootProps()return (<HStack {...group}>{options.map((value) => {const radio = getRadioProps({ value })return (<Radio isDisabled={isDisabled} key={value} {...radio}>{value}</Radio>)})}</HStack>)}function Parent() {const [isDisabled, setIsDisabled] = useState(true)// Some logic to handle the disabled statereturn (<>{/* Any components above */}<CustomRadioGroupisDisabled={isDisabled}options={['react', 'vue', 'svelte']}/>{/* Any components below */}</>)}render(<Parent />)
Parameters#
The useRadioGroup
hook accepts an object with the following properties: