CoreUI PRO for React.js
This Component is a part of CoreUI PRO for React.js, an advanced UI library offering over 100 components designed for creating responsive, sleek, and powerful applications. Experience it yourself by signing up for a complimentary 7-day trial.

React Multi Select Component

Multi Select

Customize the native <select>s with a powerful React Multi Select component that changes the element’s initial appearance and brings some new functionalities.

Other frameworks

CoreUI components are available as native Angular, Bootstrap (Vanilla JS), and Vue components. To learn more please visit the following pages.

Basic example#

A clear demonstration of implementing a basic React Multi Select dropdown, highlighting essential options and configurations.

Please select your framework.
const options = [
{
value: 0,
label: 'Angular',
},
{
value: 1,
label: 'Bootstrap',
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect options={options} label="Framework" text="Please select your framework." />
const options = [
{
value: 0,
label: 'Angular',
},
{
value: 1,
label: 'Bootstrap',
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect options={options} />

You can configure the search functionality within the component. The search property determines how the search input element is enabled and behaves. It accepts multiple types to provide flexibility in configuring search behavior. By default is set to true.

To disable the default search input element, please set search property to false like in the example below:

Please select your framework.
const options = [
{
value: 0,
label: 'Angular',
},
{
value: 1,
label: 'Bootstrap',
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect options={options} label="Framework" text="Please select your framework." search={false}/>
Added in v5.8.0

To enable the global search functionality within the React Multi Select component, please set search property to 'global'. When global search is turned on, the user can perform searches across the entire component, regardless of where their focus is within the component. This allows for a more flexible and intuitive search experience, ensuring the search input is recognized from any point within the component.

Please select your framework.
const options = [
{
value: 0,
label: 'Angular',
},
{
value: 1,
label: 'Bootstrap',
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect options={options} label="Framework" text="Please select your framework." search="global" />

When external search is enabled (search="external"), the component delegates search operations to an external API. This setup is ideal for scenarios where third-party services or custom backend implementations power search capabilities.

<CMultiSelect options={...} onFilterChange={...} search="external" />

If you want to enable both external (API-handled) and global search:

<CMultiSelect options={...} onFilterChange={...} search={{ external: true, global: true }} />

Please check the External Data section to check a working example of how to handle external data.

Modes#

Allow create options#

The allowCreateOptions property in the <CMultiselect /> component allows users to create new options in addition to selecting pre-existing ones from a list.

When this property is set to true, the user can type in a new option in the search input field of the multiselect component, and if the option does not already exist in the list, it will be created and added to the list of available options. This can be useful when the list of available options is not comprehensive or when the user needs to select an option that is not already available.

It's worth noting that this feature may not always be appropriate, depending on the specific use case of the multiselect component. In some cases, it may be preferable to restrict the user to selecting only pre-existing options, while in other cases, allowing for the creation of new options may be essential. It's important to consider the specific requirements of your application when deciding whether to enable this feature.

const options = [
{
value: 0,
label: 'Angular',
selected: true,
},
{
value: 1,
label: 'Bootstrap',
selected: true,
disabled: true,
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
selected: true,
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect allowCreateOptions options={options} />

Clear search on select#

The clearSearchOnSelect property is a Boolean attribute that can be used with the MultiSelect component in the CoreUI React library.

When clearSearchOnSelect is set to true, the search input field in the MultiSelect component will be cleared as soon as the user selects an option from the dropdown list. This means that the search query will be reset and the user will be able to start a new search immediately.

By default, clearSearchOnSelect is set to false, which means that the search input field will retain the user's search query even after an option has been selected. This can be useful in situations where the user needs to select multiple options from the dropdown list that match the same search query.

To use the clearSearchOnSelect property with the MultiSelect component in the CoreUI React library, you simply need to set it to true or false as appropriate in your code. For example:

const options = [
{
value: 0,
label: 'Angular',
selected: true,
},
{
value: 1,
label: 'Bootstrap',
selected: true,
disabled: true,
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
selected: true,
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect clearSearchOnSelect options={options} />

In this example, the clearSearchOnSelect property is set to true, which means that the search input field will be cleared as soon as the user selects an option from the dropdown list.

Selection types#

The React Multi Select component enables users to present selected items in multiple ways. Users can choose to display selected items as a counter, tags, or a list of comma-separated values.

To change the way that selected items are displayed, you can use the selectionType property to set the presentation type.

Tags#

By default, the selectionType property is set to "tags", which displays selected options as tags. Users can remove a selected option by pressing the "X" button.

const options = [
{
value: 0,
label: 'Angular',
selected: true,
},
{
value: 1,
label: 'Bootstrap',
selected: true,
disabled: true,
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
selected: true,
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect options={options} selectionType="tags" />

Counter#

In the example below, selected items from the list are counted and presented in the form of a counter. To use this option, set the selectionType to "counter".

To further customize the counter, the selectionTypeCounterText property allows you to set the text that is displayed after the counter.

const options = [
{
value: 0,
label: 'Angular',
selected: true,
},
{
value: 1,
label: 'Bootstrap',
selected: true,
disabled: true,
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
selected: true,
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect options={options} selectionType="counter" />

Text#

To display the list of selected options as comma-separated text values, set the selectionType property to "text".

const options = [
{
value: 0,
label: 'Angular',
selected: true,
},
{
value: 1,
label: 'Bootstrap',
selected: true,
disabled: true,
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
selected: true,
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect options={options} selectionType="text" />

Single Selection#

Set the multiple boolean property to false and allow select only one element.

const options = [
{
value: 0,
label: 'Angular',
},
{
value: 1,
label: 'Bootstrap',
disabled: true,
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect multiple={false} options={options} />

Custom options and options group labels#

The CoreUI React Multi Select component provides the flexibility to personalize options and group labels by utilizing custom templates. You can easily customize the options using the optionsTemplate, and for groups, you can use optionsGroupsTemplate, as demonstrated in the examples below:

import { cifPl, cifDe, cifUs, cifEs, cifGb } from '@coreui/icons'
import CIcon from '@coreui/icons-react'
const flags = {
de: cifDe,
es: cifEs,
gb: cifGb,
pl: cifPl,
us: cifUs
}
const countries = [
{
value: 'pl',
label: 'Poland',
},
{
value: 'de',
label: 'Germany',
},
{
value: 'us',
label: 'United States',
},
{
value: 'es',
label: 'Spain',
},
{
value: 'gb',
label: 'United Kingdom',
},
]
const cities = [
{
label: 'United States',
code: 'us',
options: [
{
value: 'au',
label: 'Austin',
},
{
value: 'ch',
label: 'Chicago',
},
{
value: 'la',
label: 'Los Angeles',
},
{
value: 'ny',
label: 'New York',
},
{
value: 'sa',
label: 'San Jose',
},
],
},
{
label: 'United Kingdom',
code: 'gb',
options: [
{
value: 'li',
label: 'Liverpool',
},
{
value: 'lo',
label: 'London',
},
{
value: 'ma',
label: 'Manchester',
},
],
},
]
return (
<CRow>
<CCol md={6}>
<CMultiSelect
label="Select country"
options={countries}
optionsStyle="text"
optionsTemplate={
(option) => (
<div className="d-flex">
<CIcon className="me-3" icon={flags[option.value]} size="xl"/> {option.label}
</div>
)
}
/>
</CCol>
<CCol md={6}>
<CMultiSelect
label="Select city"
options={cities}
optionsGroupsTemplate={
(option) => (
<div className="d-flex align-items-center">
<CIcon className="me-3" icon={flags[option.code]} size="xl"/> {option.label}
</div>
)
}
/>
</CCol>
</CRow>
)

Coordinated selection#

The selection of React select components can be coordinated by dynamically updating city options based on the selected country. Use the resetSelectionOnOptionsChange prop on the city select component to reset the selected city whenever the country changes, ensuring synchronized selections.

import { cifPl, cifDe, cifUs, cifEs, cifGb } from '@coreui/icons'
import CIcon from '@coreui/icons-react'
const [selectedCountry, setSelectedCountry] = useState()
const [selectedCity, setSelectedCity] = useState()
const [cities, setCities] = useState([])
const countries = [
{
value: 'pl',
label: 'Poland',
cities: [
{ value: 'warszawa', label: 'Warszawa' },
{ value: 'krakow', label: 'Kraków' },
{ value: 'lodz', label: 'Łódź' },
{ value: 'wroclaw', label: 'Wrocław' },
{ value: 'poznan', label: 'Poznań' }
]
},
{
value: 'de',
label: 'Germany',
cities: [
{ value: 'berlin', label: 'Berlin' },
{ value: 'hamburg', label: 'Hamburg' },
{ value: 'munich', label: 'Munich' },
{ value: 'cologne', label: 'Cologne' },
{ value: 'frankfurt', label: 'Frankfurt' }
]
},
{
value: 'us',
label: 'United States',
cities: [
{ value: 'new_york', label: 'New York' },
{ value: 'los_angeles', label: 'Los Angeles' },
{ value: 'chicago', label: 'Chicago' },
{ value: 'houston', label: 'Houston' },
{ value: 'phoenix', label: 'Phoenix' }
]
},
{
value: 'es',
label: 'Spain',
cities: [
{ value: 'madrid', label: 'Madrid' },
{ value: 'barcelona', label: 'Barcelona' },
{ value: 'valencia', label: 'Valencia' },
{ value: 'seville', label: 'Seville' },
{ value: 'zaragoza', label: 'Zaragoza' }
]
},
{
value: 'gb',
label: 'United Kingdom',
cities: [
{ value: 'london', label: 'London' },
{ value: 'birmingham', label: 'Birmingham' },
{ value: 'manchester', label: 'Manchester' },
{ value: 'glasgow', label: 'Glasgow' },
{ value: 'liverpool', label: 'Liverpool' }
]
}
]
const flags = {
de: cifDe,
es: cifEs,
gb: cifGb,
pl: cifPl,
us: cifUs
}
return (
<CRow>
<CCol md={6}>
<CMultiSelect
label="Select country"
multiple={false}
onChange={(country) => {
setSelectedCountry(country.length ? country[0].value : undefined)
setCities(country.length ? country[0].cities : [])
}}
options={countries}
optionsStyle="text"
optionsTemplate={
(option) => (
<div className="d-flex"><CIcon className="me-3" icon={flags[option.value]} size="xl"/> {option.label}</div>
)
}
/>
</CCol>
<CCol md={6}>
<CMultiSelect
label="Select city"
multiple={false}
onChange={(city) => setSelectedCity(city.value)}
options={cities}
optionsStyle="text"
resetSelectionOnOptionsChange
/>
</CCol>
</CRow>
)

Disabled#

Add the disabled boolean property to give it a grayed out appearance, remove pointer events, and prevent focusing.

const options = [
{
value: 0,
label: 'Angular',
selected: true,
},
{
value: 1,
label: 'Bootstrap',
selected: true,
disabled: true,
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
selected: true,
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return <CMultiSelect disabled options={options} />

Sizing#

You may also choose from small and large multi selects to match our similarly sized text inputs.

const options = [
{
value: 0,
label: 'Angular',
selected: true,
},
{
value: 1,
label: 'Bootstrap',
},
{
value: 2,
label: 'React.js',
},
{
value: 3,
label: 'Vue.js',
},
{
label: 'backend',
options: [
{
value: 4,
label: 'Django',
},
{
value: 5,
label: 'Laravel',
},
{
value: 6,
label: 'Node.js',
},
],
},
]
return (
<CRow>
<CCol md={6} className="mb-3">
<CMultiSelect options={options} selectionType="counter" size="lg" />
</CCol>
<CCol md={6} className="mb-3">
<CMultiSelect options={options} size="lg" />
</CCol>
<CCol md={6}>
<CMultiSelect options={options} selectionType="counter" size="sm" />
</CCol>
<CCol md={6}>
<CMultiSelect options={options} size="sm" />
</CCol>
</CRow>
)

Virtual Scroller (1000 records)#

To enhance performance and manage large amounts of data in React Multi Select, you can generate a list of options using <CVirtualScroller />. This component renders only the items currently visible on the screen, and as the user scrolls, new items are dynamically loaded and added to the view. This helps to reduce the data load and processing time, resulting in a more responsive UI.

To enable Virtual Scroller, simply set the virtualScroller boolean property to true, as shown in the example below.

Please select your user.
const users = [
{
value: "1",
label: "Nanon",
},
...
{
value: "1000",
label: "Jasper",
},
]
return (
<CMultiSelect
options={users}
label="Users"
text="Please select your user."
virtualScroller
/>
)

External Data#

One of the key features of React Multi Select component is the ability to load data from an external source, such as an API or a server-side script. This can be useful if you have a large amount of data that you don't want to load all at once. To load external data into a React MultiSelect, you can use the Fetch API to the data source.

Here is an example of how you might use React Multi Select with external data:

Please select your user.
const [loading, setLoading] = useState(false)
const [users, setUsers] = useState([])
const getUsers = async (name = "") => {
setLoading(true)
try {
const response = await fetch(`https://apitest.coreui.io/demos/users?first_name=${name}`)
const result = await response.json()
setUsers(result.records.map(record => ({
value: record.id,
label: record.first_name,
})))
} catch (error) {
console.error('Error fetching users:', error)
setUsers([]) // Optionally handle an error state
} finally {
setLoading(false)
}
}
// Use the debounced callback for API calls
const debouncedGetUsers = useDebouncedCallback((value) => {
getUsers(value)
}, 300)
return (
<CMultiSelect
label="Users"
loading={loading}
onFilterChange={debouncedGetUsers} // Debounce the actual API call
// onFilterChange={(value) => getUsers(value)} // API call without debounce
onShow={getUsers} // Triggers the getUsers function when the dropdown is shown
options={users}
text="Please select your user."
search={{
external: true,
global: true,
}}
virtualScroller
/>
)

This example requires the following import:

import { useDebouncedCallback } from '@coreui/react-pro'
  • useDebouncedCallback is a utility hook available in @coreui/react-pro that allows you to debounce a callback function, ensuring it is not called too frequently (e.g., when typing in a search field).
  • In this case, it is used to debounce the API call made by getUsers to reduce the number of requests during rapid input changes.

To handle a large amount of data and improve performance, this example uses the <CVirtualScroller /> component to show the options list.

Customizing#

CSS variables#

React multi selects use local CSS variables on .form-multi-select for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.

--cui-form-multi-select-zindex: #{$form-multi-select-zindex};
--cui-form-multi-select-font-family: #{$form-multi-select-font-family};
--cui-form-multi-select-font-size: #{$form-multi-select-font-size};
--cui-form-multi-select-font-weight: #{$form-multi-select-font-weight};
--cui-form-multi-select-line-height: #{$form-multi-select-line-height};
--cui-form-multi-select-color: #{$form-multi-select-color};
--cui-form-multi-select-bg: #{$form-multi-select-bg};
--cui-form-multi-select-box-shadow: #{$form-multi-select-box-shadow};
--cui-form-multi-select-border-width: #{$form-multi-select-border-width};
--cui-form-multi-select-border-color: #{$form-multi-select-border-color};
--cui-form-multi-select-border-radius: #{$form-multi-select-border-radius};
--cui-form-multi-select-disabled-color: #{$form-multi-select-disabled-color};
--cui-form-multi-select-disabled-bg: #{$form-multi-select-disabled-bg};
--cui-form-multi-select-disabled-border-color: #{$form-multi-select-disabled-border-color};
--cui-form-multi-select-focus-color: #{$form-multi-select-focus-color};
--cui-form-multi-select-focus-bg: #{$form-multi-select-focus-bg};
--cui-form-multi-select-focus-border-color: #{$form-multi-select-focus-border-color};
--cui-form-multi-select-focus-box-shadow: #{$form-multi-select-focus-box-shadow};
--cui-form-multi-select-placeholder-color: #{$form-multi-select-placeholder-color};
--cui-form-multi-select-selection-padding-y: #{$form-multi-select-selection-padding-y};
--cui-form-multi-select-selection-padding-x: #{$form-multi-select-selection-padding-x};
--cui-form-multi-select-cleaner-width: #{$form-multi-select-cleaner-width};
--cui-form-multi-select-cleaner-height: #{$form-multi-select-cleaner-height};
--cui-form-multi-select-cleaner-padding-y: #{$form-multi-select-cleaner-padding-y};
--cui-form-multi-select-cleaner-padding-x: #{$form-multi-select-cleaner-padding-x};
--cui-form-multi-select-cleaner-icon: #{escape-svg($form-multi-select-cleaner-icon)};
--cui-form-multi-select-cleaner-icon-color: #{$form-multi-select-cleaner-icon-color};
--cui-form-multi-select-cleaner-icon-hover-color: #{$form-multi-select-cleaner-icon-hover-color};
--cui-form-multi-select-cleaner-icon-size: #{$form-multi-select-cleaner-icon-size};
--cui-form-multi-select-indicator-width: #{$form-multi-select-indicator-width};
--cui-form-multi-select-indicator-height: #{$form-multi-select-indicator-height};
--cui-form-multi-select-indicator-padding-y: #{$form-multi-select-indicator-padding-y};
--cui-form-multi-select-indicator-padding-x: #{$form-multi-select-indicator-padding-x};
--cui-form-multi-select-indicator-icon: #{escape-svg($form-multi-select-indicator-icon)};
--cui-form-multi-select-indicator-icon-color: #{$form-multi-select-indicator-icon-color};
--cui-form-multi-select-indicator-icon-hover-color: #{$form-multi-select-indicator-icon-hover-color};
--cui-form-multi-select-indicator-icon-size: #{$form-multi-select-indicator-icon-size};
--cui-form-multi-select-select-all-padding-y: #{$form-multi-select-select-all-padding-y};
--cui-form-multi-select-select-all-padding-x: #{$form-multi-select-select-all-padding-x};
--cui-form-multi-select-select-all-color: #{$form-multi-select-select-all-color};
--cui-form-multi-select-select-all-bg: #{$form-multi-select-select-all-bg};
--cui-form-multi-select-select-all-border-width: #{$form-multi-select-select-all-border-width};
--cui-form-multi-select-select-all-border-color: #{$form-multi-select-select-all-border-color};
--cui-form-multi-select-select-all-hover-color: #{$form-multi-select-select-all-hover-color};
--cui-form-multi-select-select-all-hover-bg: #{$form-multi-select-select-all-hover-bg};
--cui-form-multi-select-dropdown-min-width: #{$form-multi-select-dropdown-min-width};
--cui-form-multi-select-dropdown-bg: #{$form-multi-select-dropdown-bg};
--cui-form-multi-select-dropdown-border-width: #{$form-multi-select-dropdown-border-width};
--cui-form-multi-select-dropdown-border-color: #{$form-multi-select-dropdown-border-color};
--cui-form-multi-select-dropdown-border-radius: #{$form-multi-select-dropdown-border-radius};
--cui-form-multi-select-dropdown-box-shadow: #{$form-multi-select-dropdown-box-shadow};
--cui-form-multi-select-options-padding-y: #{$form-multi-select-options-padding-y};
--cui-form-multi-select-options-padding-x: #{$form-multi-select-options-padding-x};
--cui-form-multi-select-options-font-size: #{$form-multi-select-options-font-size};
--cui-form-multi-select-options-font-weight: #{$form-multi-select-options-font-weight};
--cui-form-multi-select-options-color: #{$form-multi-select-options-color};
--cui-form-multi-select-optgroup-label-padding-y: #{$form-multi-select-optgroup-label-padding-y};
--cui-form-multi-select-optgroup-label-padding-x: #{$form-multi-select-optgroup-label-padding-x};
--cui-form-multi-select-optgroup-label-font-size: #{$form-multi-select-optgroup-label-font-size};
--cui-form-multi-select-optgroup-label-font-weight: #{$form-multi-select-optgroup-label-font-weight};
--cui-form-multi-select-optgroup-label-color: #{$form-multi-select-optgroup-label-color};
--cui-form-multi-select-optgroup-label-text-transform: #{$form-multi-select-optgroup-label-text-transform};
--cui-form-multi-select-option-padding-y: #{$form-multi-select-option-padding-y};
--cui-form-multi-select-option-padding-x: #{$form-multi-select-option-padding-x};
--cui-form-multi-select-option-margin-y: #{$form-multi-select-option-margin-y};
--cui-form-multi-select-option-margin-x: #{$form-multi-select-option-margin-x};
--cui-form-multi-select-option-border-width: #{$form-multi-select-option-border-width};
--cui-form-multi-select-option-border-color: #{$form-multi-select-option-border-color};
--cui-form-multi-select-option-border-radius: #{$form-multi-select-option-border-radius};
--cui-form-multi-select-option-box-shadow: #{$form-multi-select-option-box-shadow};
--cui-form-multi-select-option-hover-color: #{$form-multi-select-option-hover-color};
--cui-form-multi-select-option-hover-bg: #{$form-multi-select-option-hover-bg};
--cui-form-multi-select-option-focus-box-shadow: #{$form-multi-select-option-focus-box-shadow};
--cui-form-multi-select-option-disabled-color: #{$form-multi-select-option-disabled-color};
--cui-form-multi-select-option-indicator-width: #{$form-multi-select-option-indicator-width};
--cui-form-multi-select-option-indicator-bg: #{$form-multi-select-option-indicator-bg};
--cui-form-multi-select-option-indicator-border: #{$form-multi-select-option-indicator-border};
--cui-form-multi-select-option-indicator-border-radius: #{$form-multi-select-option-indicator-border-radius};
--cui-form-multi-select-option-selected-bg: #{$form-multi-select-option-selected-bg};
--cui-form-multi-select-option-selected-indicator-bg: #{$form-multi-select-option-selected-indicator-bg};
--cui-form-multi-select-option-selected-indicator-bg-image: #{escape-svg($form-multi-select-option-selected-indicator-bg-image)};
--cui-form-multi-select-option-selected-indicator-border-color: #{$form-multi-select-option-selected-indicator-border-color};
--cui-form-multi-select-tag-padding-y: #{$form-multi-select-tag-padding-y};
--cui-form-multi-select-tag-padding-x: #{$form-multi-select-tag-padding-x};
--cui-form-multi-select-tag-bg: #{$form-multi-select-tag-bg};
--cui-form-multi-select-tag-border-width: #{$form-multi-select-tag-border-width};
--cui-form-multi-select-tag-border-color: #{$form-multi-select-tag-border-color};
--cui-form-multi-select-tag-border-radius: #{$form-multi-select-tag-border-radius};
--cui-form-multi-select-tag-delete-width: #{$form-multi-select-tag-delete-width};
--cui-form-multi-select-tag-delete-height: #{$form-multi-select-tag-delete-height};
--cui-form-multi-select-tag-delete-icon: #{escape-svg($form-multi-select-tag-delete-icon)};
--cui-form-multi-select-tag-delete-icon-color: #{$form-multi-select-tag-delete-icon-color};
--cui-form-multi-select-tag-delete-icon-hover-color: #{$form-multi-select-tag-delete-icon-hover-color};
--cui-form-multi-select-tag-delete-icon-size: #{$form-multi-select-tag-delete-icon-size};
--cui-form-multi-select-selection-tags-gap: #{$form-multi-select-selection-tags-gap};
--cui-form-multi-select-selection-tags-padding-y: #{$form-multi-select-selection-tags-padding-y};
--cui-form-multi-select-selection-tags-padding-x: #{$form-multi-select-selection-tags-padding-x};

How to use CSS variables#

const vars = {
'--my-css-var': 10,
'--my-another-css-var': 'red',
}
return <CMultiSelect style={vars}>...</CMultiSelect>

SASS variables#

$form-multi-select-zindex: 1000 !default;
$form-multi-select-font-family: $input-font-family !default;
$form-multi-select-font-size: $input-font-size !default;
$form-multi-select-font-weight: $input-font-weight !default;
$form-multi-select-line-height: $input-line-height !default;
$form-multi-select-color: $input-color !default;
$form-multi-select-bg: $input-bg !default;
$form-multi-select-box-shadow: $box-shadow-inset !default;
$form-multi-select-border-width: $input-border-width !default;
$form-multi-select-border-color: $input-border-color !default;
$form-multi-select-border-radius: $input-border-radius !default;
$form-multi-select-border-radius-sm: $input-border-radius-sm !default;
$form-multi-select-border-radius-lg: $input-border-radius-lg !default;
$form-multi-select-disabled-color: $input-disabled-color !default;
$form-multi-select-disabled-bg: $input-disabled-bg !default;
$form-multi-select-disabled-border-color: $input-disabled-border-color !default;
$form-multi-select-focus-color: $input-focus-color !default;
$form-multi-select-focus-bg: $input-focus-bg !default;
$form-multi-select-focus-border-color: $input-focus-border-color !default;
$form-multi-select-focus-box-shadow: $input-btn-focus-box-shadow !default;
$form-multi-select-invalid-border-color: var(--cui-form-invalid-border-color) !default;
$form-multi-select-valid-border-color: var(--cui-form-valid-border-color) !default;
$form-multi-select-placeholder-color: var(--cui-secondary-color) !default;
$form-multi-select-selection-padding-y: $input-padding-y !default;
$form-multi-select-selection-padding-x: $input-padding-x !default;
$form-multi-select-selection-tags-gap: .25rem !default;
$form-multi-select-selection-tags-padding-y: .25rem !default;
$form-multi-select-selection-tags-padding-x: .25rem !default;
$form-multi-select-tag-bg: var(--cui-secondary-bg) !default;
$form-multi-select-tag-border-width: var(--cui-border-width) !default;
$form-multi-select-tag-border-color: var(--cui-border-color) !default;
$form-multi-select-tag-border-radius: .25rem !default;
$form-multi-select-tag-border-radius-sm: .125rem !default;
$form-multi-select-tag-border-radius-lg: .375rem !default;
$form-multi-select-tag-padding-y: .0625rem !default;
$form-multi-select-tag-padding-x: .5rem !default;
$form-multi-select-tag-delete-width: .75rem !default;
$form-multi-select-tag-delete-height: .75rem !default;
$form-multi-select-tag-delete-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#000'><path d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/></svg>") !default;
$form-multi-select-tag-delete-icon-color: var(--cui-secondary-color) !default;
$form-multi-select-tag-delete-icon-hover-color: var(--cui-body-color) !default;
$form-multi-select-tag-delete-icon-size: .5rem !default;
$form-multi-select-cleaner-width: 1.5rem !default;
$form-multi-select-cleaner-height: 1.5rem !default;
$form-multi-select-cleaner-padding-x: 0 !default;
$form-multi-select-cleaner-padding-y: 0 !default;
$form-multi-select-cleaner-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#000'><path d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/></svg>") !default;
$form-multi-select-cleaner-icon-color: var(--cui-tertiary-color) !default;
$form-multi-select-cleaner-icon-hover-color: var(--cui-body-color) !default;
$form-multi-select-cleaner-icon-size: .625rem !default;
$form-multi-select-indicator-width: 1.5rem !default;
$form-multi-select-indicator-height: 1.5rem !default;
$form-multi-select-indicator-padding-x: 0 !default;
$form-multi-select-indicator-padding-y: 0 !default;
$form-multi-select-indicator-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='#000'><path d='M256.045 416.136.717 160.807l29.579-29.579 225.749 225.748 225.749-225.748 29.579 29.579-255.328 255.329z'/></svg>") !default;
$form-multi-select-indicator-icon-color: var(--cui-tertiary-color) !default;
$form-multi-select-indicator-icon-hover-color: var(--cui-body-color) !default;
$form-multi-select-indicator-icon-size: .75rem !default;
$form-multi-select-dropdown-min-width: 100% !default;
$form-multi-select-dropdown-bg: var(--cui-body-bg) !default;
$form-multi-select-dropdown-border-color: var(--cui-border-color) !default;
$form-multi-select-dropdown-border-width: var(--cui-border-width) !default;
$form-multi-select-dropdown-border-radius: var(--cui-border-radius) !default;
$form-multi-select-dropdown-box-shadow: var(--cui-box-shadow) !default;
$form-multi-select-select-all-padding-y: .5rem !default;
$form-multi-select-select-all-padding-x: .75rem !default;
$form-multi-select-select-all-color: var(--cui-body-secondary-color) !default;
$form-multi-select-select-all-bg: transparent !default;
$form-multi-select-select-all-hover-color: var(--cui-body-color) !default;
$form-multi-select-select-all-hover-bg: transparent !default;
$form-multi-select-select-all-border-width: $input-border-width !default;
$form-multi-select-select-all-border-color: $input-border-color !default;
$form-multi-select-options-padding-y: .5rem !default;
$form-multi-select-options-padding-x: .75rem !default;
$form-multi-select-options-font-size: $font-size-base !default;
$form-multi-select-options-font-weight: $font-weight-normal !default;
$form-multi-select-options-color: var(--cui-body-color) !default;
$form-multi-select-optgroup-label-padding-y: .5rem !default;
$form-multi-select-optgroup-label-padding-x: .625rem !default;
$form-multi-select-optgroup-label-font-size: 80% !default;
$form-multi-select-optgroup-label-font-weight: $font-weight-bold !default;
$form-multi-select-optgroup-label-color: var(--cui-tertiary-color) !default;
$form-multi-select-optgroup-label-text-transform: uppercase !default;
$form-multi-select-option-padding-y: .5rem !default;
$form-multi-select-option-padding-x: 1.25rem !default;
$form-multi-select-option-margin-y: 1px !default;
$form-multi-select-option-margin-x: 0 !default;
$form-multi-select-option-border-width: $input-border-width !default;
$form-multi-select-option-border-color: transparent !default;
$form-multi-select-option-border-radius: var(--cui-border-radius) !default;
$form-multi-select-option-box-shadow: $box-shadow-inset !default;
$form-multi-select-option-hover-color: var(--cui-body-color) !default;
$form-multi-select-option-hover-bg: var(--cui-tertiary-bg) !default;
$form-multi-select-option-focus-box-shadow: $input-btn-focus-box-shadow !default;
$form-multi-select-option-indicator-width: 1em !default;
$form-multi-select-option-indicator-bg: $form-check-input-bg !default;
$form-multi-select-option-indicator-border: $form-check-input-border !default;
$form-multi-select-option-indicator-border-radius: .25em !default;
$form-multi-select-option-selected-bg: var(--cui-secondary-bg) !default;
$form-multi-select-option-selected-indicator-bg: $form-check-input-checked-bg-color !default;
$form-multi-select-option-selected-indicator-bg-image: $form-check-input-checked-bg-image !default;
$form-multi-select-option-selected-indicator-border-color: $form-multi-select-option-selected-indicator-bg !default;
$form-multi-select-option-disabled-color: var(--cui-secondary-color) !default;
$form-multi-select-font-size-lg: $input-font-size-lg !default;
$form-multi-select-selection-padding-y-lg: $input-padding-y-lg !default;
$form-multi-select-selection-padding-x-lg: $input-padding-x-lg !default;
$form-multi-select-selection-tags-gap-lg: .25rem !default;
$form-multi-select-selection-tags-padding-y-lg: .25rem !default;
$form-multi-select-selection-tags-padding-x-lg: .25rem !default;
$form-multi-select-tag-padding-y-lg: .175rem !default;
$form-multi-select-tag-padding-x-lg: .5rem !default;
$form-multi-select-font-size-sm: $input-font-size-sm !default;
$form-multi-select-selection-padding-y-sm: $input-padding-y-sm !default;
$form-multi-select-selection-padding-x-sm: $input-padding-x-sm !default;
$form-multi-select-selection-tags-gap-sm: .125rem !default;
$form-multi-select-selection-tags-padding-y-sm: .0625rem !default;
$form-multi-select-selection-tags-padding-x-sm: .125rem !default;
$form-multi-select-tag-padding-y-sm: .075rem !default;
$form-multi-select-tag-padding-x-sm: .5rem !default;

API#

CMultiSelect#

import { CMultiSelect } from '@coreui/react-pro'
// or
import CMultiSelect from '@coreui/react-pro/src/components/multi-select/CMultiSelect'
PropertyDescriptionTypeDefault
allowCreateOptions
4.11.0+
Allow users to create options if they are not in the list of options.boolean-
ariaCleanerLabel
5.8.0+
A string that provides an accessible label for the cleaner button. This label is read by screen readers to describe the action associated with the button.stringClear all selections
classNameA string of all className you want applied to the base component.string-
cleanerEnables selection cleaner element.booleantrue
clearSearchOnSelect
4.11.0+
Clear current search on selecting an item.boolean-
container
5.8.0+
Appends the dropdown to a specific element. You can pass an HTML element or function that returns a single element.Element | DocumentFragment | (() => Element | DocumentFragment)-
disabledToggle the disabled state for the component.boolean-
feedback
4.2.0+
Provide valuable, actionable feedback.ReactNode-
feedbackInvalid
4.2.0+
Provide valuable, actionable feedback.ReactNode-
feedbackValid
4.2.0+
Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, :invalid and :valid.ReactNode-
idSet the id attribute for the native select element.

[Deprecated since v5.3.0] The name attribute for the native select element is generated based on the id property:
- <select name="\{id\}-multi-select" />
string-
invalidSet component validation state to invalid.boolean-
label
4.2.0+
Add a caption for a component.ReactNode-
loading
4.11.0+
When set, the options list will have a loading style: loading spinner and reduced opacity.boolean-
multipleIt specifies that multiple options can be selected at once.booleantrue
name
5.3.0+
The name attribute for the select element.string-
onChangeExecute a function when a user changes the selected option.(selected: Option[]) => void-
onFilterChange
4.8.0+
Execute a function when the filter value changed.(value: string) => void-
onHideThe callback is fired when the Multi Select component requests to be hidden.() => void-
onShowThe callback is fired when the Multi Select component requests to be shown.() => void-
optionsList of option elements.(Option | OptionsGroup)[]-
optionsGroupsTemplate
4.12.0+
Custom template for options groups.(option: OptionsGroup) => ReactNode-
optionsMaxHeightSets maxHeight of options list.string | numberauto
optionsStyleSets option style.'text' | 'checkbox'checkbox
optionsTemplate
4.12.0+
Custom template for options.(option: Option) => ReactNode-
placeholderSpecifies a short hint that is visible in the search input.stringSelect...
portal
5.8.0+
Generates dropdown menu using createPortal.booleanfalse
requiredWhen it is present, it indicates that the user must choose a value before submitting the form.boolean-
resetSelectionOnOptionsChange
5.3.0+
Determines whether the selected options should be cleared when the options list is updated. When set to true, any previously selected options will be reset whenever the options list undergoes a change. This ensures that outdated selections are not retained when new options are provided.booleanfalse
searchThe search prop determines how the search input element is enabled and behaves. It accepts multiple types to provide flexibility in configuring search behavior:

- true : Enables the default search input element with standard behavior.
- 'external': Enables an external search mechanism, possibly integrating with external APIs or services.
- 'global': When set, the user can perform searches across the entire component, regardless of where their focus is within the component.
- { external?: boolean; global?: boolean }: Allows for granular control over the search behavior by specifying individual properties. It is useful when you also want to use external and global search.
Searchtrue
searchNoResultsLabelSets the label for no results when filtering.ReactNodeNo results found
selectAllEnables select all button.booleantrue
selectAllLabelSets the select all button label.ReactNodeSelect all options
selectionTypeSets the selection style.'text' | 'counter' | 'tags'tags
selectionTypeCounterTextSets the counter selection label.stringitem(s) selected
sizeSize the component small or large.'sm' | 'lg'-
text
4.2.0+
Add helper text to the component.ReactNode-
tooltipFeedback
4.2.0+
Display validation feedback in a styled tooltip.boolean-
validSet component validation state to valid.boolean-
virtualScroller
4.8.0+
Enable virtual scroller for the options list.boolean-
visibleToggle the visibility of multi select dropdown.booleanfalse
visibleItems
4.8.0+
Amount of visible items when virtualScroller is set to true.number10