logo

Education

The ABCs of Material UI Autocomplete in React

Authore Name
Kesar Bhimani

Software Development Executive - I

Last updated on Sep 15, 2023

When it comes to building user interfaces (UIs) in React, Material UI is my go-to library. The Material UI library provides a wide range of pre-built components that I can use to create interactive and visually appealing UIs. Among these components, the Material UI Autocomplete component stands out for its versatility and utility.

Brief Overview of Material UI

Material UI is a popular library in the React ecosystem. It provides a set of React components that implement Google's Material Design guidelines. I often use Material UI in my projects because it allows me to build high-quality UIs with less effort. The Material UI Autocomplete component is one such component that I frequently use.

Importance of Autocomplete in UI Design

Autocomplete is an important feature in UI design. It enhances the user experience by providing suggested options as the user types into a search input. This feature is particularly useful when the input value can be one of many possible values. For example, when filling in a location field, the Autocomplete component can suggest valid location names based on the user's input. This not only makes the input process faster and easier for the user but also helps ensure that the input value is valid.

Introduction to Autocomplete in Material UI

The Material UI Autocomplete component is a normal text input enhanced with the input autocomplete feature. It provides a set of interactions that are superior to a normal text input. For example, the Autocomplete component can suggest similar or previous searches as the user types, allow the input of multiple values, and even accept an arbitrary value that is not among the suggested options.

Setting Up the Development Environment

Before we dive into the details of the Material UI Autocomplete component, let's set up our development environment. This involves installing Node.js and npm, setting up a new React project, and installing Material UI in the project.

Installing Node.js and npm

Node.js is a JavaScript runtime that enables the execution of JavaScript code outside of a browser. npm (Node Package Manager) is a utility included with Node.js that allows us to install and manage JavaScript packages.

To install Node.js and npm, I usually head over to the official Node.js website and download the installer for my operating system. After running the installer, I can verify that Node.js and npm are installed correctly by running the following commands in my terminal:

1 node -v 2 npm -v 3

These commands should print the installed versions of Node.js and npm, respectively.

Setting up a new React project

Once Node.js and npm are installed, I can set up a new React project using the Create React App tool. Create React App is a command-line tool that sets up a new React project with a sensible default configuration. I can create a new React project by running the following command in my terminal:

1 npx create-react-app my-autocomplete-app 2

This command creates a new React project in a directory named my-autocomplete-app.

Installing Material UI in the React Project

With the React project set up, the next step is to install Material UI. I can do this by navigating to the project directory and running the following command:

1 npm install @material-ui/core @material-ui/lab 2

This command installs the core Material UI package, which contains common components like buttons and text fields, and the Material UI Lab package, which contains more experimental components like the Autocomplete component.

Basic Understanding of Autocomplete

Before we delve into the specifics of the Material UI Autocomplete component, it's crucial to understand what Autocomplete is and why it's important in UI design.

Definition and use cases of Autocomplete

Autocomplete, also known as typeahead or autosuggest, is a feature that suggests possible values to users as they type into a search input. This feature is especially useful when the input value can be one of many possible values. For instance, when filling in a location field, the Autocomplete component can suggest valid location names based on the user's input. This not only makes the input process faster and easier for the user but also helps ensure that the input value is valid.

Autocomplete is commonly used in search fields, where it can suggest similar or previous searches as the user types. It can also be used in form inputs where the input value must be one of a predefined set of allowed values. For example, in a registration form, an Autocomplete component for the "Country" field can ensure that users enter a valid country name.

How Autocomplete improves user experience

Autocomplete significantly enhances the user experience in several ways. First, it speeds up the input process by suggesting possible values. This is particularly useful when the list of possible values is long, as it saves the user from having to type out the entire value.

Second, Autocomplete can help ensure that the input value is valid. By suggesting only valid values, it prevents the user from entering invalid data. This is especially important in form inputs where the input value must match one of a predefined set of allowed values.

Lastly, Autocomplete can improve the user experience by remembering the user's previous searches. When the user starts typing a search query that they've entered before, the Autocomplete component can suggest the previous search, saving the user time and effort.

Material UI Autocomplete Component

Now that we have a basic understanding of what Autocomplete is and why it's important in UI design, let's dive into the specifics of the Material UI Autocomplete component.

Introduction to Material UI Autocomplete Component

The Material UI Autocomplete component is a normal text input enhanced with the input autocomplete feature. It provides a set of interactions that are superior to normal text input. For example, the Autocomplete component can suggest similar or previous searches as the user types, allow the input of multiple values, and even accept an arbitrary value that is not among the suggested options.

Importing the Autocomplete Component

To use the Material UI Autocomplete component in a React app, I first need to import it from the Material UI library. I can do this by adding the following import statement at the top of my React component file:

1 import Autocomplete from '@material-ui/lab/Autocomplete'; 2

This import statement makes the Autocomplete component available for use in my React component. I can then use the Autocomplete component in my JSX code, like so:

1 <Autocomplete 2 options={options} 3 renderInput={(params) => <TextField {...params} label="Autocomplete" variant="outlined" />} 4 /> 5

Implementing Basic Autocomplete

Now that we've imported the Material UI Autocomplete component, let's implement a basic Autocomplete input. This involves creating an Autocomplete input, populating it with options, and handling the selection of an option.

Creating a basic Autocomplete input

Creating a basic Autocomplete input with Material UI is straightforward. I start by rendering the Autocomplete component in my JSX code. The Autocomplete component takes a renderInput prop, which is a function that returns the input element to be used for the Autocomplete. In most cases, I use the TextField component from Material UI for this purpose.

Here's how I create a basic Autocomplete input:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 export default function BasicAutocomplete() { 6 return ( 7 <Autocomplete 8 renderInput={(params) => <TextField {...params} label="Basic Autocomplete" variant="outlined" />} 9 /> 10 ); 11 } 12

In this example, I render the Autocomplete component with a TextField as its input element. The TextField has a label of "Basic Autocomplete" and an outlined variant.

Populating the Autocomplete Options

Next, I populate the Autocomplete input with options. The Autocomplete component takes an options prop, which is an array of the possible values that the user can select. Each option in the array is rendered as a separate item in the Autocomplete dropdown.

Here's how I populate the Autocomplete input with options:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = ['Option 1', 'Option 2', 'Option 3']; 6 7 export default function PopulatedAutocomplete() { 8 return ( 9 <Autocomplete 10 options={options} 11 renderInput={(params) => <TextField {...params} label="Populated Autocomplete" variant="outlined" />} 12 /> 13 ); 14 } 15

In this example, I define an array of options and pass it to the Autocomplete component via the options prop. Now, when the user clicks on the Autocomplete input, they will see a dropdown with the options "Option 1", "Option 2", and "Option 3".

Handling the selection of an option

The last step in implementing a basic Autocomplete input is handling the selection of an option. The Autocomplete component provides an onChange prop for this purpose. The onChange prop is a function that is called whenever the user selects an option.

Here's how I handle the selection of an option:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = ['Option 1', 'Option 2', 'Option 3']; 6 7 export default function SelectableAutocomplete() { 8 const handleSelection = (event, value) => { 9 console.log(`You selected ${value}`); 10 }; 11 12 return ( 13 <Autocomplete 14 options={options} 15 onChange={handleSelection} 16 renderInput={(params) => <TextField {...params} label="Selectable Autocomplete" variant="outlined" />} 17 /> 18 ); 19 } 20

In this example, I define a handleSelection function that logs the selected value to the console. I then pass this function to the Autocomplete component via the onChange prop. Now, whenever the user selects an option, the handleSelection function will be called, and the selected value will be logged to the console.

Customizing Autocomplete Options

The Material UI Autocomplete component provides several props that allow us to customize the appearance and behavior of the Autocomplete options. In this section, I'll show you how to customize the appearance of options and how to group options.

Customizing the appearance of options

By default, the Autocomplete component displays the options as plain text. However, I can customize the appearance of the options by using the getOptionLabel and renderOption props.

The getOptionLabel prop is a function that returns the string to be displayed for each option. The renderOption prop is a function that returns a React node to be displayed for each option.

Here's an example of how I can customize the appearance of options:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = [ 6 { id: 1, label: 'Option 1', icon: '🌞' }, 7 { id: 2, label: 'Option 2', icon: '🌛' }, 8 { id: 3, label: 'Option 3', icon: '⭐' }, 9 ]; 10 11 export default function CustomizedAutocomplete() { 12 return ( 13 <Autocomplete 14 options={options} 15 getOptionLabel={(option) => option.label} 16 renderOption={(option) => ( 17 <div> 18 {option.icon} {option.label} 19 </div> 20 )} 21 renderInput={(params) => <TextField {...params} label="Customized Autocomplete" variant="outlined" />} 22 /> 23 ); 24 } 25

In this example, each option is an object with id, label, and icon properties. The getOptionLabel function returns the label property of each option, and the renderOption function returns a div with the icon and label properties of each option. Now, the options in the Autocomplete dropdown will be displayed with an icon followed by the label.

Grouping Options

The Autocomplete component also allows us to group options. This is useful when the options can be categorized into different groups. To group options, I need to structure the options as an array of option groups, where each group is an object with a title property and an options property.

Here's an example of how I can group options:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = [ 6 { 7 title: 'Group 1', 8 options: ['Option 1', 'Option 2', 'Option 3'], 9 }, 10 { 11 title: 'Group 2', 12 options: ['Option 4', 'Option 5', 'Option 6'], 13 }, 14 ]; 15 16 export default function GroupedAutocomplete() { 17 return ( 18 <Autocomplete 19 options={options} 20 groupBy={(option) => option.title} 21 getOptionLabel={(option) => option} 22 renderInput={(params) => <TextField {...params} label="Grouped Autocomplete" variant="outlined" />} 23 /> 24 ); 25 } 26

In this example, each option group is an object with a title property and an options property. The title property is the title of the group, and the options property is an array of options in the group. The groupBy function returns the title property of each option, which is used to group the options. Now, the options in the Autocomplete dropdown will be displayed in groups, with a title for each group.

Multiple Values in Autocomplete

In some scenarios, you might want to allow users to select more than one value from the Autocomplete dropdown. For example, in a form where users can select multiple categories for a product. The Material UI Autocomplete component provides multiple prop for this purpose.

Allowing multiple option selection

The multiple prop is a boolean prop that determines whether the Autocomplete component should allow the selection of multiple values. When multiple is true, the Autocomplete component allows the selection of multiple values.

Here's an example of how I can allow the selection of multiple values:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = ['Option 1', 'Option 2', 'Option 3']; 6 7 export default function MultipleAutocomplete() { 8 return ( 9 <Autocomplete 10 multiple 11 options={options} 12 renderInput={(params) => <TextField {...params} label="Multiple Autocomplete" variant="outlined" />} 13 /> 14 ); 15 } 16

In this example, I set the multiple prop to true. Now, the Autocomplete component allows the selection of multiple values. The selected values are displayed in the Autocomplete input as chips, which can be removed by clicking on the delete icon on each chip.

Handling multiple selected options

When the multiple prop is true, the onChange prop is a function that is called whenever the selected values change. The onChange function receives two arguments: the event that triggered the change and the array of selected values.

Here's how I can handle multiple selected options:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = ['Option 1', 'Option 2', 'Option 3']; 6 7 export default function SelectableMultipleAutocomplete() { 8 const handleSelection = (event, values) => { 9 console.log(`You selected ${values.join(', ')}`); 10 }; 11 12 return ( 13 <Autocomplete 14 multiple 15 options={options} 16 onChange={handleSelection} 17 renderInput={(params) => <TextField {...params} label="Selectable Multiple Autocomplete" variant="outlined" />} 18 /> 19 ); 20 } 21

In this example, I define a handleSelection function that logs the selected values to the console. I then pass this function to the Autocomplete component via the onChange prop. Now, whenever the selected values change, the handleSelection function will be called, and the selected values will be logged into the console.

Controlled vs Uncontrolled Autocomplete

When working with form inputs in React, there are two ways to manage the input's state: controlled and uncontrolled. The same concepts apply to the Material UI Autocomplete component. In this section, I'll explain the difference between controlled and uncontrolled Autocomplete and show you how to implement each one.

Understanding controlled and uncontrolled components

In a controlled component, the component's state is managed by the React component. This means that the value of the input is always driven by the React state. Whenever the input value changes, an event handler updates the React state, and the input value is updated to reflect the new state.

In an uncontrolled component, the component's state is managed by the DOM. This means that the input value is driven by the DOM state, and React does not have control over the input's value. The input value can be retrieved from the DOM when needed, for example, when the form is submitted.

Implementing controlled Autocomplete

To implement a controlled Autocomplete component, I use the value and onChange props. The value prop sets the current value of the Autocomplete input, and the onChange prop is a function that is called whenever the input value changes.

Here's an example of how I can implement a controlled Autocomplete component:

1 import React, { useState } from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = ['Option 1', 'Option 2', 'Option 3']; 6 7 export default function ControlledAutocomplete() { 8 const [value, setValue] = useState(options[0]); 9 10 const handleChange = (event, newValue) => { 11 setValue(newValue); 12 }; 13 14 return ( 15 <Autocomplete 16 value={value} 17 onChange={handleChange} 18 options={options} 19 renderInput={(params) => <TextField {...params} label="Controlled Autocomplete" variant="outlined" />} 20 /> 21 ); 22 } 23

In this example, I use the useState hook from React to create a state variable for the input value. The handleChange function updates the input value whenever it changes. The value prop sets the current value of the Autocomplete input, and the onChange prop sets the function to be called when the input value changes.

Implementing uncontrolled Autocomplete

To implement an uncontrolled Autocomplete component, I use the defaultValue prop. The defaultValue prop sets the initial value of the Autocomplete input, but subsequent changes to the input value are not controlled by React.

Here's an example of how I can implement an uncontrolled Autocomplete component:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = ['Option 1', 'Option 2', 'Option 3']; 6 7 export default function UncontrolledAutocomplete() { 8 return ( 9 <Autocomplete 10 defaultValue={options[0]} 11 options={options} 12 renderInput={(params) => <TextField {...params} label="Uncontrolled Autocomplete" variant="outlined" />} 13 /> 14 ); 15 } 16

In this example, the defaultValue prop sets the initial value of the Autocomplete input. However, subsequent changes to the input value are not controlled by React.

Whether to use controlled or uncontrolled Autocomplete depends on the specific requirements of your application. In general, controlled components give you more flexibility and control, while uncontrolled components can be simpler to use in some cases.

Autocomplete with Other Form Components

The Material UI Autocomplete component can be used with other form components to create complex forms. In this section, I'll show you how to integrate Autocomplete with form validation and how to use Autocomplete with other Material UI form components.

Integrating Autocomplete with form validation

Form validation is an important aspect of any form. It ensures that the user has entered valid data before the form is submitted. The Material UI Autocomplete component can be integrated with form validation by using the required prop and the onBlur event.

The required prop is a boolean prop that indicates whether the Autocomplete input is required. If required is true and the user tries to submit the form without selecting an option, the form will not be submitted and the Autocomplete input will be highlighted with an error state.

The onBlur event is fired when the Autocomplete input loses focus. This event can be used to perform form validation when the user leaves the Autocomplete input.

Here's an example of how I can integrate Autocomplete with form validation:

1 import React, { useState } from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 5 const options = ['Option 1', 'Option 2', 'Option 3']; 6 7 export default function ValidatedAutocomplete() { 8 const [value, setValue] = useState(''); 9 const [error, setError] = useState(false); 10 11 const handleChange = (event, newValue) => { 12 setValue(newValue); 13 setError(false); 14 }; 15 16 const handleBlur = () => { 17 if (!value) { 18 setError(true); 19 } 20 }; 21 22 return ( 23 <Autocomplete 24 value={value} 25 onChange={handleChange} 26 onBlur={handleBlur} 27 options={options} 28 renderInput={(params) => <TextField {...params} label="Validated Autocomplete" variant="outlined" error={error} />} 29 /> 30 ); 31 } 32

In this example, I use the useState hook from React to create a state variable for the input value and the error state. The handleChange function updates the input value and resets the error state whenever the input value changes. The handleBlur function sets the error state to true if the input value is empty when the Autocomplete input loses focus. The error prop sets the error state of the TextField component.

Using Autocomplete with other Material UI form components

The Material UI Autocomplete component can be used with other Material UI form components to create complex forms. For example, I can use the Autocomplete component with the TextField, Checkbox, and Button components to create a form where the user can select multiple options and submit the form.

Here's an example of how I can use Autocomplete with other Material UI form components:

1 import React from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 import Checkbox from '@material-ui/core/Checkbox'; 5 import Button from '@material-ui/core/Button'; 6 7 const options = ['Option 1', 'Option 2', 'Option 3']; 8 9 export default function FormAutocomplete() { 10 return ( 11 <form> 12 <Autocomplete 13 multiple 14 options={options} 15 renderOption={(option, { selected }) => ( 16 <> 17 <Checkbox checked={selected} /> 18 {option} 19 </> 20 )} 21 renderInput={(params) => <TextField {...params} label="Form Autocomplete" variant="outlined" />} 22 /> 23 <Button type="submit" variant="contained" color="primary"> 24 Submit 25 </Button> 26 </form> 27 ); 28 } 29

In this example, I create a form with an Autocomplete input and a submit button. The Autocomplete input allows the selection of multiple options, and each option is rendered with a checkbox. The user can select multiple options and submit the form by clicking the submit button.

These are just a few examples of how the Material UI Autocomplete component can be used with other form components. The possibilities are endless, and you can create complex forms by combining the Autocomplete component with other Material UI form components and your own custom components.

Performance Considerations

When using the Material UI Autocomplete component, especially in large applications or with large datasets, it's important to consider performance. Autocomplete can be resource-intensive, as it involves filtering and rendering a potentially large list of options as the user types. In this section, I'll discuss the performance implications of Autocomplete and how to optimize Autocomplete performance.

Performance implications of Autocomplete

The performance of the Autocomplete component depends largely on the number of options and how the options are filtered and rendered. If the list of options is very large, filtering and rendering the options can be slow, leading to a laggy user experience.

Additionally, if the options are fetched asynchronously, such as from an API or a database, there can be a delay while the options are being fetched. This can also lead to a laggy user experience, especially if the network connection is slow or the server is under heavy load.

Optimizing Autocomplete Performance

There are several ways to optimize the performance of the Autocomplete component:

  • Limit the number of options: If possible, limit the number of options to a reasonable amount. This reduces the amount of work that needs to be done to filter and render the options.
  • Debounce input changes: Instead of filtering the options immediately as the user types, you can debounce the input changes. This means that the options are only filtered after the user has stopped typing for a certain amount of time. This can significantly reduce the number of times the options need to be filtered and rendered.
  • Use virtualization: If the list of options is very large, you can use virtualization to improve performance. Virtualization involves only rendering the options that are currently visible in the dropdown, instead of all options. This can significantly reduce the amount of rendering work and improve performance.
  • Optimize asynchronous fetching: If the options are fetched asynchronously, try to optimize the fetching process. For example, you could cache the results of previous fetches to avoid unnecessary network requests. Or you could use a loading indicator to give the user feedback while the options are being fetched.

Here's an example of how I can optimize Autocomplete performance by debouncing input changes and using virtualization:

1 import React, { useState, useMemo } from 'react'; 2 import Autocomplete from '@material-ui/lab/Autocomplete'; 3 import TextField from '@material-ui/core/TextField'; 4 import useMediaQuery from '@material-ui/core/useMediaQuery'; 5 import ListboxComponent from './ListboxComponent'; // A virtualized listbox component 6 7 const options = Array.from({ length: 10000 }, (v, k) => `Option ${k + 1}`); 8 9 export default function OptimizedAutocomplete() { 10 const [inputValue, setInputValue] = useState(''); 11 const isSmallDevice = useMediaQuery('(max-width:600px)'); 12 const debouncedInputValue = useMemo(() => { 13 // Debounce the input value if not on a small device 14 return isSmallDevice ? inputValue : debounce(inputValue, 300); 15 }, [inputValue, isSmallDevice]); 16 17 return ( 18 <Autocomplete 19 inputValue={debouncedInputValue} 20 onInputChange={(event, newInputValue) => { 21 setInputValue(newInputValue); 22 }} 23 options={options} 24 ListboxComponent={ListboxComponent} // Use a virtualized listbox component 25 renderInput={(params) => <TextField {...params} label="Optimized Autocomplete" variant="outlined" />} 26 /> 27 ); 28 } 29

In this example, I debounce the input value changes and use a virtualized listbox component to render the options. This significantly reduces the amount of work that needs to be done as the user types and improves the performance of the Autocomplete component.

By considering these performance optimizations, you can ensure that your Material UI Autocomplete component provides a smooth and responsive user experience, even with large datasets or in resource-constrained environments.

Embark Your React Journey with WiseGPT!

In this comprehensive guide, we have explored the Material UI Autocomplete component in depth. We started by understanding the importance of Autocomplete in UI design and how it enhances user experience. We then delved into setting up the development environment and discussed the basic understanding of Autocomplete.

We further explored how to implement a basic Autocomplete input, and customize the appearance of options, and group options. We also learned how to allow multiple selections and handle multiple selected options. We then discussed the difference between controlled and uncontrolled Autocomplete and how to implement each one.

Moreover, we saw how to integrate Autocomplete with other form components and form validation. Finally, we discussed the performance implications of Autocomplete and how to optimize its performance.

By understanding these concepts and techniques, you can effectively use the Material UI Autocomplete component in your React projects to create interactive and user-friendly forms. Whether you're building a simple search input or a complex form with multiple selections and validation, the Material UI Autocomplete component provides a powerful and flexible solution.

But as we conclude this journey, let's imagine a scenario. What if you had a silent partner that could take your UI designs and transform them into clean, efficient code? What if this partner could mirror your coding style, auto-create models and functions, and handle the complexities of API requests, response parsing, and error management strategies?

This isn't a flight of fancy, but a reality made possible by WiseGPT, a plugin developed by DhiWise. It's like a skilled co-developer by your side, ready to convert your UI designs into code. It offers a wide range of built-in templates and screens for your React projects, and it doesn't impose any limit on the output size.

As React developers, we are always on the lookout for tools that can make our work more efficient, enjoyable, and creative. WiseGPT fits this description perfectly. It's not just a plugin, but a partner that empowers you to focus on what you do best: creating amazing user experiences with React.

So, as we wrap up our deep dive into Material UI Autocomplete in React, consider the possibilities that WiseGPT opens up. It's a testament to how far we've come in the world of development, where AI and human creativity can come together to create something truly remarkable. Happy coding!

Short on time? Speed things up with DhiWise!!

Tired of manually designing screens, coding on weekends, and technical debt? Let DhiWise handle it for you!

You can build an e-commerce store, healthcare app, portfolio, blogging website, social media or admin panel right away. Use our library of 40+ pre-built free templates to create your first application using DhiWise.

Sign up to DhiWise for free

Frequently asked questions

How do you use autocomplete material UI in React?

down arrow

How does Mui autocomplete work?

down arrow

What is autocomplete menu style in Mui?

down arrow

What is the clear button in material UI autocomplete?

down arrow

How do I use autocomplete in Formik?

down arrow

How do I add autocomplete in React?

down arrow
Read More