Kombai Logo

Building a Tag Input Field with React MUI Chip and Autocomplete

As a front-end developer, creating intuitive and functional input fields is a common requirement. One particularly useful pattern is the tag input field - allowing users to add multiple selections as tags. Material UI (MUI) provides powerful components like Chip and Autocomplete that can be combined to create a robust tag input solution.

In this guide, I'll walk you through building a complete tag input field with React MUI that includes autocomplete functionality, custom styling, validation, and advanced features. We'll explore both basic implementations and more sophisticated solutions that you can adapt for your projects.

What You'll Learn

By the end of this tutorial, you'll be able to:

  • Understand MUI Chip component fundamentals and its key props
  • Implement a basic tag input field using MUI Chip and Autocomplete
  • Create controlled and uncontrolled tag input components
  • Add validation, custom styling, and accessibility features
  • Handle complex use cases like async data loading and form integration
  • Implement performance optimizations for large datasets

Understanding MUI Chip Component

The MUI Chip component is a versatile UI element that represents compact entities like tags, filters, or options. Before we combine it with Autocomplete, let's understand what makes Chip so useful for tag inputs.

Core Chip Properties and Variants

Chips in MUI are compact elements that represent attributes, inputs, or actions. They're perfect for tag inputs because they provide built-in functionality for displaying selected values with options to delete them.

The Chip component offers several variants that change its appearance and behavior:

VariantDescriptionUse Case
filled (default)Solid background with contrasting textStandard tags, selected filters
outlinedTransparent with outlined borderMore subtle tag representations

You can also control the Chip's size using the size prop, which accepts small or medium (default).

Essential Chip Props

Chips come with several key props that make them ideal for tag inputs:

PropTypeDescription
labelnodeThe content displayed on the chip
onDeletefunctionCallback fired when the delete icon is clicked
deleteIconnodeCustom delete icon element
colorstringColor of the chip (default, primary, secondary, etc.)
disabledbooleanDisables interaction with the chip
iconnodeIcon element displayed before the label
clickablebooleanMakes the chip clickable
onClickfunctionCallback fired when the chip is clicked

Let's look at a basic Chip example to understand its usage:

Customizing Chip Appearance

You can customize Chips using MUI's sx prop or theme overrides. The sx prop provides a shorthand way to apply styles directly to components:

For more consistent styling across your application, you can customize Chips through theme overrides:

Understanding MUI Autocomplete

The Autocomplete component is MUI's solution for combobox inputs that provide suggestions as you type. When paired with Chip, it becomes a powerful tag input field.

Key Autocomplete Props

PropTypeDescription
multiplebooleanAllows multiple selections, rendering them as chips
optionsarrayArray of available options
valueanyCurrent value (controlled component)
defaultValueanyDefault value (uncontrolled component)
onChangefunctionCallback fired when the value changes
getOptionLabelfunctionFunction that defines how to display options
renderTagsfunctionFunction to customize how tags are rendered
freeSolobooleanAllows values not in the options list
filterOptionsfunctionCustom filter function for options
loadingbooleanIndicates if options are being loaded
disableClearablebooleanRemoves the clear button

Building a Basic Tag Input Field

Now let's combine Chip and Autocomplete to create a basic tag input field. We'll start with a simple implementation and gradually add more features.

Setting Up the Project

First, let's set up a new React project and install the necessary dependencies:

Creating a Simple Tag Input Component

Let's build a basic tag input field that allows users to select multiple options from a predefined list:

In this example:

  • We use the multiple prop on Autocomplete to allow selecting multiple options
  • We maintain selected tags in state with useState
  • The renderTags prop customizes how selected options appear as Chips
  • The getTagProps function provides necessary props for each Chip, including delete functionality

Handling Tag Selection and Removal

The Autocomplete component handles most of the tag selection and removal logic for us:

  1. When a user selects an option from the dropdown, it's added to the value array
  2. When a user clicks the delete icon on a Chip, the option is removed from the array
  3. The onChange handler is called with the updated array, which we use to update our state

Enhancing the Tag Input with Custom Styling

Let's improve our tag input with custom styling to make it more visually appealing and match your application's design:

In this enhanced version:

  • We've created a custom styled Chip component with a different shape and colors
  • We've adjusted the Autocomplete's styling to improve the spacing of tags
  • We've added conditional placeholder text that only shows when no tags are selected
  • We've wrapped the component in a Box with width constraints

Building a Tag Input with Free Text Entry

Often, you'll want to allow users to enter custom tags that aren't in the predefined list. The freeSolo prop enables this functionality:

Key features of this implementation:

  • The freeSolo prop allows entering values not in the options list
  • We added a handleKeyDown function to support creating tags by pressing Enter or comma
  • We filter out empty strings to prevent invalid tags
  • We check for duplicates before adding new tags

Advanced: Tag Input with Validation

Let's build a more sophisticated tag input that includes validation for the entered tags:

This implementation includes:

  • Tag validation with specific rules (length, characters, duplicates)
  • Error messages that display below the input
  • Controlled input value for better validation handling
  • Filtering of already selected tags from the suggestions

Integrating with Form Libraries

In real-world applications, tag inputs are often part of larger forms. Let's see how to integrate our tag input with a popular form library like Formik:

This implementation:

  • Uses Formik to manage form state and validation
  • Integrates Yup for schema validation
  • Shows how to connect the tag input to Formik's form values
  • Demonstrates error handling in the context of a form

Advanced: Asynchronous Tag Suggestions

In many applications, tag suggestions come from an API rather than a static list. Let's build a tag input that fetches suggestions asynchronously:

This implementation includes:

  • Asynchronous fetching of tag suggestions
  • Loading indicator while suggestions are being fetched
  • Debounced input to prevent excessive API calls
  • Handling of dropdown open/close states

Creating a Tag Input with Custom Tag Components

Sometimes you need more customization than the standard Chip component offers. Let's create a tag input with custom tag components:

In this implementation:

  • We've created a completely custom tag component instead of using Chip
  • Each tag includes an avatar with the first letter of the tag name
  • Tags are color-coded based on their category
  • We're using more complex objects as options instead of simple strings
  • We specify how to compare options with isOptionEqualToValue

Now let's combine everything we've learned to create a comprehensive tag input component that incorporates all the best features:

This comprehensive implementation includes:

  • A reusable component with extensive configuration options
  • Debounced async suggestion fetching
  • Custom styling and animations
  • Advanced validation with customizable rules
  • Tag limits (min/max)
  • Error and helper messages
  • Accessibility enhancements
  • Performance optimizations

Performance Optimization for Large Datasets

When working with large datasets, you need to optimize your tag input for performance. Here's how to handle virtualization and efficient rendering:

This implementation:

  • Uses react-window for virtualized rendering of the dropdown options
  • Only renders visible items in the viewport, greatly improving performance
  • Works efficiently with thousands of options
  • Filters selected options from the dropdown to avoid duplicates

Accessibility Enhancements

Let's improve our tag input with enhanced accessibility features:

This implementation includes:

  • ARIA attributes for improved screen reader support
  • Live region announcements for dynamic changes
  • Keyboard navigation enhancement
  • Clear instructions for screen reader users
  • Proper labeling and descriptions
  • Role attributes for semantic HTML structure

Best Practices and Common Issues

When implementing tag inputs with MUI, keep these best practices in mind:

Best Practices

  1. Controlled vs. Uncontrolled Components

Always prefer controlled components for complex inputs like tag fields. This gives you more control over validation, state management, and integration with forms.

  1. Debouncing Input for API Calls

When fetching suggestions from an API, always debounce your requests to prevent excessive calls:

  1. Providing Clear User Feedback

Always provide clear feedback about validation, limits, and actions:

  1. Handling Large Datasets

For large datasets, always use virtualization and pagination:

Common Issues and Solutions

  1. Issue: Tags are cut off or overflow the container

Solution: Use proper styling and ellipsis for long tags:

  1. Issue: Duplicate tags are being added

Solution: Check for duplicates before adding new tags:

  1. Issue: Performance issues with many tags

Solution: Optimize rendering and consider limiting the number of visible tags:

  1. Issue: Validation not working correctly

Solution: Implement comprehensive validation before adding tags:

Wrapping Up

In this comprehensive guide, we've explored how to build robust tag input fields using MUI's Chip and Autocomplete components. We've covered everything from basic implementations to advanced features like custom styling, validation, async suggestions, accessibility enhancements, and performance optimizations.

The power of MUI lies in its flexibility and composability, allowing you to create sophisticated UI components that meet your specific requirements. By combining Chip and Autocomplete, you can create tag inputs that are not only functional but also provide an excellent user experience.

Remember to prioritize accessibility, performance, and user feedback in your implementations. With the techniques and examples provided in this guide, you're now equipped to build tag input fields that can handle complex scenarios and integrate seamlessly with your React applications.