A modern form with a group of radio buttons in a React app.

Simplify Your Forms with react-radio-group in React

The Gray Cat
The Gray Cat

Handling radio buttons in React applications can often lead to repetitive code and complex state management. The react-radio-group library simplifies this process by providing an intuitive API for creating grouped radio buttons. This guide will walk you through its features, installation, and practical examples for both basic and advanced usage.

Why Use react-radio-group?

Traditional implementation of radio buttons in React involves repetitive attributes like name, type, checked, and onChange. Managing state for these buttons can also be tricky. The react-radio-group library addresses these issues by abstracting the complexity into two components: <RadioGroup> and <Radio>. These components streamline the creation of accessible, manageable, and customizable radio button groups.

Key Features

  • Simplified State Management: Automatically handles checked states based on the selectedValue prop.
  • Accessibility: Ensures proper ARIA roles and attributes for screen readers.
  • Customizability: Allows you to define custom components for rendering.
  • Ease of Use: Reduces boilerplate code by lifting repetitive attributes to the <RadioGroup> wrapper.

Getting Started

Installation

To install the library, use either npm or yarn:

npm install react-radio-group
yarn add react-radio-group

You can then import the components into your project:

import { RadioGroup, Radio } from 'react-radio-group';

Basic Usage

Creating a Simple Radio Group

The following example demonstrates how to create a basic radio group for selecting a fruit:

import React, { useState } from 'react';
import { RadioGroup, Radio } from 'react-radio-group';

const FruitSelector = () => {
  const [selectedValue, setSelectedValue] = useState('apple');

  const handleChange = (value: string) => {
    setSelectedValue(value);
  };

  return (
    <RadioGroup name="fruit" selectedValue={selectedValue} onChange={handleChange}>
      <label>
        <Radio value="apple" /> Apple
      </label>
      <label>
        <Radio value="orange" /> Orange
      </label>
      <label>
        <Radio value="watermelon" /> Watermelon
      </label>
    </RadioGroup>
  );
};

export default FruitSelector;

Explanation

  1. The <RadioGroup> component wraps all <Radio> components.
  2. The selectedValue prop determines which radio button is selected.
  3. The onChange handler updates the state when a new option is selected.

Advanced Usage

Custom Rendering with Components

You can customize the rendering of the <RadioGroup> by using the Component prop:

import React from 'react';
import { RadioGroup, Radio } from 'react-radio-group';

const CustomRadioGroup = () => {
  return (
    <RadioGroup name="custom" selectedValue="option1" Component="ul">
      <li>
        <label>
          <Radio value="option1" /> Option 1
        </label>
      </li>
      <li>
        <label>
          <Radio value="option2" /> Option 2
        </label>
      </li>
    </RadioGroup>
  );
};

export default CustomRadioGroup;

Here, the <RadioGroup> is rendered as an unordered list (<ul>), demonstrating how you can adapt it to different layouts.

Handling Complex State

For scenarios where you need more control over the state or additional logic during selection:

import React, { useState } from 'react';
import { RadioGroup, Radio } from 'react-radio-group';

const AdvancedSelector = () => {
  const [selectedValue, setSelectedValue] = useState<string | null>(null);

  const handleSelection = (value: string) => {
    console.log(`Selected value: ${value}`);
    setSelectedValue(value);
  };

  return (
    <div>
      <h3>Select your favorite color:</h3>
      <RadioGroup name="colors" selectedValue={selectedValue} onChange={handleSelection}>
        {['Red', 'Green', 'Blue'].map((color) => (
          <label key={color}>
            <Radio value={color.toLowerCase()} /> {color}
          </label>
        ))}
      </RadioGroup>
      {selectedValue && <p>You selected: {selectedValue}</p>}
    </div>
  );
};

export default AdvancedSelector;

Explanation

  • Dynamically generates radio buttons based on an array.
  • Logs the selected value to the console for debugging purposes.
  • Displays additional UI based on the selected option.

Integrating with Forms

To integrate the radio group into forms:

import React from 'react';
import { useForm } from 'react-hook-form';
import { RadioGroup, Radio } from 'react-radio-group';

const FormExample = () => {
  const { register, handleSubmit } = useForm();

  const onSubmit = (data: any) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <RadioGroup name="gender">
        <label>
          <Radio value="male" {...register('gender')} /> Male
        </label>
        <label>
          <Radio value="female" {...register('gender')} /> Female
        </label>
      </RadioGroup>
      <button type="submit">Submit</button>
    </form>
  );
};

export default FormExample;

This example uses react-hook-form for form handling while leveraging react-radio-group.

Conclusion

The react-radio-group library simplifies working with radio buttons in React by providing an elegant API that reduces boilerplate code while ensuring accessibility and ease of customization. Whether you’re building simple forms or complex UIs, this library is a great addition to your toolkit. For more insights on similar libraries, check out articles like “Taming Forms with Simple Redux Form” or “Mastering Smooth Transitions with React Transition Group”.