syncfusion-react-dropdowns — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-react-dropdowns (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The AutoComplete component provides a matched suggestion list as the user types into an input field, allowing selection from the filtered results. It supports local and remote data, rich filtering options, templates, grouping, virtualization, and full accessibility.
#### Getting Started 📄 Read: references/getting-started.md
@syncfusion/ej2-react-dropdowns)popupHeight, popupWidth)#### Data Binding 📄 Read: references/data-binding.md
fields mapping (value, groupBy, iconCss)DataManager (ODataV4Adaptor, WebApiAdaptor)query property to filter/select remote datasortOrder for alphabetical ordering#### Filtering 📄 Read: references/filtering.md
StartsWith, EndsWith, ContainssuggestionCount – limit number of suggestionsminLength – minimum characters before search triggersignoreCase – case-sensitive filteringignoreAccent – diacritics filteringdebounceDelay – delay filtering to reduce requestsfiltering event#### Grouping 📄 Read: references/grouping.md
fields.groupBygroupTemplate#### Templates 📄 Read: references/templates.md
itemTemplate – customize each list itemgroupTemplate – customize group headerheaderTemplate – static popup headerfooterTemplate – static popup footernoRecordsTemplate – message when no data foundactionFailureTemplate – message on remote fetch failure#### Value Binding 📄 Read: references/value-binding.md
allowObjectBindingvalue property#### Virtualization 📄 Read: references/virtual-scroll.md
enableVirtualization for large datasetsVirtualScroll servicequery.take()#### Disabled Items 📄 Read: references/disabled-items.md
fields.disableddisableItem method for dynamic disablingenabled={false}#### Accessibility and Localization 📄 Read: references/accessibility-localization.md
enableRtl)L10n (noRecordsTemplate, actionFailureTemplate text)#### Styling and Customization 📄 Read: references/styling.md
cssClass property for custom class injectionallowResize)#### How-To: Autofill, Highlight, and Icons 📄 Read: references/how-to.md
autofill – suggest first matched item on Arrow Downhighlight – highlight typed characters in suggestion listfields.iconCss#### API Reference 📄 Read: references/api.md
Installation: Pin packages to a specific major version to reduce supply-chain risk. ``bash npm install @syncfusion/ej2-react-dropdowns@^33.x.x @syncfusion/ej2-react-inputs@^33.x.x @syncfusion/ej2-base@^33.x.x ``import { AutoCompleteComponent } from '@syncfusion/ej2-react-dropdowns'; // ^33.x.x
import '@syncfusion/ej2-base/styles/tailwind3.css';
import '@syncfusion/ej2-react-inputs/styles/tailwind3.css';
import '@syncfusion/ej2-react-dropdowns/styles/tailwind3.css';
const sportsData: string[] = [
'Badminton', 'Basketball', 'Cricket', 'Football',
'Golf', 'Hockey', 'Rugby', 'Snooker', 'Tennis'
];
export default function App() {
return (
<AutoCompleteComponent
id="sports-ac"
dataSource={sportsData}
placeholder="Find a game"
/>
);
}#### Object data source with field mapping
const sportsData = [
{ id: 'Game1', game: 'Badminton' },
{ id: 'Game2', game: 'Basketball' },
];
const fields = { value: 'game' };
<AutoCompleteComponent dataSource={sportsData} fields={fields} placeholder="Find a game" />#### Remote data binding (security-first)
Security: Do not call arbitrary third-party URLs directly from client code. Route external API calls through a trusted server-side proxy that enforces allowed endpoints, authentication, rate limits, and response validation.
import { DataManager, ODataV4Adaptor, Query } from '@syncfusion/ej2-data';
// Use a controlled server proxy endpoint here. Do not use public third-party URLs directly.
const customerData = new DataManager({
adaptor: new ODataV4Adaptor(),
crossDomain: true,
url: 'https://your-trusted-proxy.example/api/customers'
});
const query = new Query().from('Customers').select(['ContactName', 'CustomerID']).take(6);
const fields = { value: 'ContactName' };
<AutoCompleteComponent
dataSource={customerData}
query={query}
fields={fields}
sortOrder="Ascending"
placeholder="Find a customer" />#### Filtering with custom options
<AutoCompleteComponent
dataSource={sportsData}
filterType="StartsWith"
minLength={2}
suggestionCount={5}
debounceDelay={300}
ignoreCase={true}
placeholder="Type to search"
/>#### Accessing methods via ref
import { AutoCompleteComponent } from '@syncfusion/ej2-react-dropdowns';
import { useRef } from 'react';
export default function App() {
const acRef = useRef<AutoCompleteComponent>(null);
return (
<>
<AutoCompleteComponent ref={acRef} dataSource={sportsData} placeholder="Find a game" />
<button onClick={() => acRef.current?.showPopup()}>Open</button>
<button onClick={() => acRef.current?.clear()}>Clear</button>
</>
);
}The ComboBox component provides a dropdown input that allows users to type to filter or select from a predefined list. It supports local and remote data binding, custom values, filtering, grouping, templates, virtual scrolling, and full accessibility.
The ComboBox is a specialized dropdown input that bridges typed input fields with selection lists. Key characteristics:
Installation: Pin packages to a specific major version to reduce supply-chain risk. ``bash npm install @syncfusion/ej2-react-dropdowns@^33.x.x ``Choose your starting point based on your task:
#### Getting Started 📄 Read: references/getting-started.md
When to read:
#### Data Binding & Sources 📄 Read: references/data-binding.md
When to read:
#### Filtering & Search Behavior 📄 Read: references/filtering-and-search.md
When to read:
#### Grouping & Sorting 📄 Read: references/grouping-and-sorting.md
When to read:
#### Templates & Customization 📄 Read: references/templates-and-customization.md
When to read:
#### Advanced Features 📄 Read: references/advanced-features.md
When to read:
#### Styling & Theming 📄 Read: references/styling-and-theming.md
When to read:
#### Popup Resizing 📄 Read: references/popup-resizing.md
When to read:
#### How-To Guide 📄 Read: references/how-to-guide.md
When to read:
#### Troubleshooting 📄 Read: references/troubleshooting.md
When to read:
#### API Reference 📄 Read: references/api.md
When to read:
ChangeEventArgs, FilteringEventArgs, etc.)FieldSettingsModel, PopupEventArgs, etc.)#### Installation & Setup
Installation: Pin packages to a specific major version to reduce supply-chain risk. ``bash npm install @syncfusion/ej2-react-dropdowns@^33.x.x ``#### Basic ComboBox (Functional Component)
import { ComboBoxComponent } from '@syncfusion/ej2-react-dropdowns';
import '@syncfusion/ej2-base/styles/tailwind3.css';
import '@syncfusion/ej2-react-dropdowns/styles/tailwind3.css';
export default function App() {
const sportsList = ['Badminton', 'Cricket', 'Football', 'Golf', 'Tennis'];
return (
<ComboBoxComponent
id="combobox"
dataSource={sportsList}
placeholder="Select a sport"
allowCustom={true}
/>
);
}#### With Data Binding (JSON Objects)
export default function App() {
const sportsData = [
{ Id: 'game1', Game: 'Badminton', Players: 2 },
{ Id: 'game2', Game: 'Football', Players: 11 },
{ Id: 'game3', Game: 'Cricket', Players: 11 }
];
const fields = { text: 'Game', value: 'Id' };
return (
<ComboBoxComponent
id="combobox"
dataSource={sportsData}
fields={fields}
placeholder="Select a game"
change={(e) => console.log('Selected:', e.value)}
/>
);
}#### Pattern 1: Filtered Search for User Selection Problem: User needs to find items in a list of 500+ entries. Solution: Use filtering with controlled input to display only matching items. For very large datasets (5,000+ items), combine with enableVirtualization and inject VirtualScroll.
import { ComboBoxComponent, Inject, VirtualScroll } from '@syncfusion/ej2-react-dropdowns';
const [filterValue, setFilterValue] = useState('');
<ComboBoxComponent
dataSource={largeDataset}
fields={{ text: 'name', value: 'id' }}
filtering={(e) => filterByName(e, 'name')}
change={(e) => setFilterValue(e.value)}
allowFiltering={true}
enableVirtualization={true}
popupHeight="200px"
>
<Inject services={[VirtualScroll]} />
</ComboBoxComponent>#### Pattern 2: Grouped Categories Problem: Items need to be organized by type for clarity. Solution: Use groupBy field mapping with data grouped by category.
const categorizedData = [
{ Category: 'Sports', Item: 'Cricket', value: 1 },
{ Category: 'Sports', Item: 'Football', value: 2 },
{ Category: 'Games', Item: 'Chess', value: 3 },
{ Category: 'Games', Item: 'Carrom', value: 4 }
];
const fields = {
text: 'Item',
value: 'value',
groupBy: 'Category'
};
<ComboBoxComponent dataSource={categorizedData} fields={fields} />#### Pattern 3: Remote Data with Loading (security-first) Problem: Fetch data from an API based on user search.
Security-first solution: Route external API requests through a trusted server-side proxy that validates and sanitizes responses. Do not embed third‑party URLs directly in client-side code.
import { DataManager, WebApiAdaptor } from '@syncfusion/ej2-data';
// Use your server-side proxy here. The proxy should enforce allowed upstream hosts and
// sanitize responses before returning to the client.
const dataManager = new DataManager({
url: 'https://your-trusted-proxy.example/api/search',
adaptor: new WebApiAdaptor()
});
<ComboBoxComponent
dataSource={dataManager}
fields={{ text: 'name', value: 'id' }}
allowFiltering={true} />#### Pattern 4: Custom Template for Rich Content Problem: Display icons or additional info with each item. Solution: Use itemTemplate prop for custom HTML rendering.
const itemTemplate = (props) => {
return (
<div className="flex items-center gap-2">
<span className={`icon icon-${props.value}`}></span>
<span>{props.name}</span>
<small className="text-gray-500">({props.players} players)</small>
</div>
);
};
<ComboBoxComponent
dataSource={sportsData}
itemTemplate={itemTemplate}
fields={{ text: 'name', value: 'id' }}
/>| Prop | Type | Description | Common Use | ||
|---|---|---|---|---|---|
dataSource | Array\ | DataManager | Data items to display | All use cases | |
fields | FieldSettingsModel | Map data fields (text, value, groupBy, iconCss, disabled) | Complex data | ||
placeholder | string | Hint text when empty | UX guidance | ||
allowCustom | boolean | Allow user to enter custom values not in the list. Default: true | Open-ended input | ||
allowFiltering | boolean | Enable filter bar (search box) in the popup. Default: false | Search capability | ||
enableVirtualization | boolean | Enable virtual scrolling for large datasets. Requires <Inject services={[VirtualScroll]} />. Default: false | Large datasets (5,000+ items) | ||
sortOrder | SortOrder | 'None' \ | 'Ascending' \ | 'Descending'. Default: null | Sorted lists |
popupHeight | string\ | number | Dropdown height (e.g., '300px'). Default: '300px' | Layout control | |
popupWidth | string\ | number | Dropdown width (e.g., '100%'). Default: '100%' | Layout control | |
enabled | boolean | Enable/disable component. Default: true | Conditional rendering | ||
readonly | boolean | Prevent user input. Default: false | View-only mode | ||
showClearButton | boolean | Show clear (×) button. Default: true | Allow clearing selection | ||
change | EmitType\<ChangeEventArgs\> | Fires when selection changes | Event handling | ||
filtering | EmitType\<FilteringEventArgs\> | Fires when user types; use for custom filter logic | Advanced search | ||
itemTemplate | Function\ | string | Custom item HTML for each list item | Rich UI |
The DropDownList component provides a list of predefined values from which users can select a single value. It supports local and remote data binding, filtering, grouping, custom templates, virtual scrolling, accessibility, and rich customization.
#### Getting Started 📄 Read: references/getting-started.md
@syncfusion/ej2-react-dropdowns)#### Data Binding & Value Binding 📄 Read: references/data-binding.md
fields mapping (text, value, groupBy, iconCss)DataManager (OData, ODataV4, WebAPI adaptors)fields.disabled#### Filtering 📄 Read: references/filtering.md
allowFiltering for search-as-you-typefiltering event with updateDataargs.preventDefaultAction = true in custom handlersstartswith, contains, endsWith, case-sensitive optionsPredicate with .or() to match typed text against both text and value fields (or any combination)ignoreAccent), debounce delay#### Grouping & Templates 📄 Read: references/grouping-and-templates.md
groupBy field#### Features & Configuration 📄 Read: references/features-and-configuration.md
sortOrder: ascending, descending)enableVirtualization)allowResize)#### Accessibility, Styling & Localization 📄 Read: references/accessibility-styling-localization.md
e-error, e-success)L10n, noRecordsTemplate, actionFailureTemplate)enableRtl)#### API Reference 📄 Read: references/api.md
FieldSettingsModel, ChangeEventArgs, SelectEventArgs, PopupEventArgs, FilteringEventArgs#### How-To Patterns 📄 Read: references/how-to.md
Installation: Pin packages to a specific major version to reduce supply-chain risk. ``bash npm install @syncfusion/ej2-react-dropdowns@^33.x.x --save ``// 1. See pinned install command above.
// 2. CSS in src/App.css
// @import "../node_modules/@syncfusion/ej2-base/styles/tailwind3.css";
// @import "../node_modules/@syncfusion/ej2-inputs/styles/tailwind3.css";
// @import "../node_modules/@syncfusion/ej2-react-dropdowns/styles/tailwind3.css";
import { DropDownListComponent } from '@syncfusion/ej2-react-dropdowns';
import './App.css';
export default function App() {
const sportsData: string[] = ['Badminton', 'Cricket', 'Football', 'Golf', 'Tennis'];
return (
<DropDownListComponent
id="ddlelement"
dataSource={sportsData}
placeholder="Select a game"
/>
);
}#### JSON Object Data with Fields Mapping
import { DropDownListComponent } from '@syncfusion/ej2-react-dropdowns';
export default function App() {
const countryData = [
{ Id: 'au', Country: 'Australia' },
{ Id: 'br', Country: 'Brazil' },
{ Id: 'cn', Country: 'China' },
{ Id: 'in', Country: 'India' },
];
const fields = { text: 'Country', value: 'Id' };
return (
<DropDownListComponent
dataSource={countryData}
fields={fields}
placeholder="Select a country"
/>
);
}#### Filtering (Search-as-you-type)
import { DropDownListComponent, FilteringEventArgs } from '@syncfusion/ej2-react-dropdowns';
import { Query } from '@syncfusion/ej2-data';
export default function App() {
const searchData = [
{ Index: 's1', Country: 'Alaska' },
{ Index: 's2', Country: 'California' },
{ Index: 's3', Country: 'Florida' },
];
const fields = { text: 'Country', value: 'Index' };
function onFiltering(args: FilteringEventArgs) {
// Local example: updateData is applied against local `searchData` below.
// For remote filtering, route requests through a trusted server proxy and
// validate/sanitize responses before calling `updateData`.
args.preventDefaultAction = true; // prevent built-in filter from running alongside custom logic
let query = new Query();
query = args.text !== '' ? query.where('Country', 'startswith', args.text, true) : query;
args.updateData(searchData, query);
}
return (
<DropDownListComponent
dataSource={searchData}
fields={fields}
allowFiltering={true}
filtering={onFiltering}
placeholder="Select a country"
/>
);
}#### Preselect a Value
<DropDownListComponent
dataSource={sportsData}
value="Cricket"
placeholder="Select a game"
/>#### Grouped Items
const vegetableData = [
{ Vegetable: 'Cabbage', Category: 'Leafy and Salad', Id: 'item1' },
{ Vegetable: 'Chickpea', Category: 'Beans', Id: 'item6' },
{ Vegetable: 'Garlic', Category: 'Bulb and Stem', Id: 'item9' },
];
const fields = { groupBy: 'Category', text: 'Vegetable', value: 'Id' };
<DropDownListComponent dataSource={vegetableData} fields={fields} placeholder="Select a vegetable" />| Prop | Type | Purpose | |
|---|---|---|---|
dataSource | `any[] \ | DataManager` | Data for the list items |
fields | FieldSettingsModel | Maps text, value, groupBy, iconCss, disabled | |
value | `string \ | number` | Selected/preselected value |
placeholder | string | Input placeholder text | |
allowFiltering | boolean | Enables search filtering | |
filtering | event | Handler for custom filter logic | |
popupHeight | string | Popup list height (default auto) | |
popupWidth | string | Popup list width (default matches input) | |
sortOrder | SortOrder | 'None', 'Ascending', 'Descending' | |
enableVirtualization | boolean | Virtual scroll for large data | |
allowResize | boolean | User-resizable popup | |
enabled | boolean | Enable/disable entire component | |
readonly | boolean | Read-only mode | |
showClearButton | boolean | Shows ✕ button to clear selection | |
enableRtl | boolean | Right-to-left layout |
Simple static list → Pass string[] to dataSource, done.
Data from API → Use DataManager with WebApiAdaptor; read references/data-binding.md.
Search/filter as user types → Set allowFiltering={true}, handle filtering event; read references/filtering.md.
Categorized items → Map groupBy field; read references/grouping-and-templates.md.
Custom item layout → Use itemTemplate; read references/grouping-and-templates.md.
Large dataset (10k+ items) → Enable enableVirtualization + inject VirtualScroll; read references/features-and-configuration.md.
Dependent dropdowns → Reload second dropdown's dataSource on first's change event; read references/how-to.md.
The Syncfusion ListBox component displays a list of items in a scrollable container, enabling single or multiple selection. It supports local and remote data binding, drag-and-drop reordering, filtering, grouping, custom templates, dual-list transfer, and full accessibility.
Navigate to specific topics based on your implementation needs:
#### Getting Started 📄 Read: references/getting-started.md
#### Selection & Events 📄 Read: references/selection.md
#### Data Binding & Structure 📄 Read: references/data-binding.md
#### Custom Templates & Icons 📄 Read: references/icons-and-templates.md
#### Advanced Features 📄 Read: references/features.md
#### Styling & Appearance 📄 Read: references/style-and-appearance.md
#### Accessibility 📄 Read: references/accessibility.md
#### How-To Guides 📄 Read: references/how-to-guides.md
#### Dual ListBox (Transfer) 📄 Read: references/dual-list-box.md
#### API Reference 📄 Read: references/api.md
SelectionSettingsModel, ToolbarSettingsModel, FieldSettingsModel, SourceDestinationModelInstallation: Pin packages to a specific major version to reduce supply-chain risk. ``bash npm install @syncfusion/ej2-react-dropdowns@^33.x.x @syncfusion/ej2-base@^33.x.x ``Basic ListBox with single selection:
import { ListBoxComponent } from '@syncfusion/ej2-react-dropdowns'; // ^33.x.x
import './App.css';
function App() {
const data = [
{ text: 'JavaScript', id: '1' },
{ text: 'TypeScript', id: '2' },
{ text: 'React', id: '3' },
{ text: 'Vue', id: '4' },
{ text: 'Angular', id: '5' }
];
const handleChange = (e) => {
console.log('Selected:', e.value);
};
return (
<ListBoxComponent
dataSource={data}
fields={{ text: 'text', value: 'id' }}
selectionSettings={{ mode: 'Single' }}
change={handleChange}
/>
);
}
export default App;#### Multiple Selection
<ListBoxComponent
dataSource={data}
selectionSettings={{ mode: 'Multiple' }}
/>#### Checkbox Selection
Requires injecting `CheckBoxSelection` service.
import { ListBoxComponent, SelectionSettingsModel, Inject, CheckBoxSelection } from '@syncfusion/ej2-react-dropdowns';
const selectionSettings: SelectionSettingsModel = { showCheckbox: true };
<ListBoxComponent dataSource={data} selectionSettings={selectionSettings}>
<Inject services={[CheckBoxSelection]} />
</ListBoxComponent>#### With Search/Filter
<ListBoxComponent
dataSource={data}
allowFiltering={true}
filterBarPlaceholder="Search items"
/>#### Custom Item Template
const itemTemplate = (props) => {
return (
<div>
<span className="icon">{props.icon}</span>
<span>{props.text}</span>
</div>
);
}
<ListBoxComponent
dataSource={data}
itemTemplate={itemTemplate}
/>#### Grouping Items
<ListBoxComponent
dataSource={groupedData}
fields={{ text: 'text', groupBy: 'category' }}
/>| Prop | Purpose | Example |
|---|---|---|
dataSource | Array of items to display | [{ text: 'Item', id: '1' }] |
fields | Maps data properties to display | { text: 'name', value: 'id' } |
selectionSettings | Defines selection mode and checkbox display. For showCheckbox: true, inject CheckBoxSelection service | { mode: 'Multiple' } / { showCheckbox: true } |
allowFiltering | Enables filter search box | true |
allowDragAndDrop | Enables item drag-drop | true |
itemTemplate | Custom template for items | Function returning JSX |
enabled | Enables/disables the component | true / false |
Need help? Each reference file contains examples, edge cases, and troubleshooting tips.
The Mention Component attaches to a target editable element (e.g. a <div contenteditable>) and displays a suggestion popup when the user types a trigger character (default @). Selecting an item inserts it inline into the editor.
#### Getting Started 📄 Read: references/getting-started.md
@syncfusion/ej2-react-dropdowns)MentionComponent setup with target propmentionChar) and showMentionChar⚠️ Security Note: Installing npm packages (@syncfusion/ej2-react-dropdownsand related) must be a deliberate, user-confirmed step. Do not allow automated agents to runnpm installwithout explicit user approval, as this introduces supply-chain risk.
#### Working with Data 📄 Read: references/working-with-data.md
fields (text, value, groupBy, iconCss)ODataV4Adaptor)WebApiAdaptor)query to filter/select remote fields#### Filtering Data 📄 Read: references/filtering-data.md
minLength)Contains, StartsWith, EndsWithallowSpaces)suggestionCount)debounceDelay)#### Templates 📄 Read: references/template.md
itemTemplate) for custom list renderingdisplayTemplate) for selected value formatnoRecordsTemplate)spinnerTemplate)groupTemplate)#### Customization 📄 Read: references/customization.md
showMentionChar)suffixText)popupHeight, popupWidth)mentionChar)requireLeadingSpace)cssClass)highlight)ignoreAccent, ignoreCase)zIndex)#### Sorting 📄 Read: references/sorting.md
Ascending, Descending, None#### Disabled Items 📄 Read: references/disabled-items.md
fields.disableddisableItem() method#### Accessibility 📄 Read: references/accessibility.md
aria-selected, aria-activedescendent, aria-owns)enableRtl)#### Localization 📄 Read: references/localization.md
noRecordsTemplate text via L10nlocale property#### API Reference 📄 Read: references/api.md
target, dataSource, fields, mentionChar, minLength, suggestionCountaddItem, disableItem, getDataByValue, getItems, showPopup, hidePopup, search, destroyselect, change, filtering, beforeOpen, opened, closed, dataBound, actionBegin, actionComplete, actionFailureimport { MentionComponent } from '@syncfusion/ej2-react-dropdowns';
import * as React from 'react';
// CSS imports
// @import "../node_modules/@syncfusion/ej2-base/styles/tailwind3.css";
// @import "../node_modules/@syncfusion/ej2-react-dropdowns/styles/tailwind3.css";
function App() {
const mentionTarget = '#commentBox';
const users = [
{ Name: 'Selma Rose', EmailId: '[email protected]' },
{ Name: 'Robert', EmailId: '[email protected]' },
{ Name: 'William', EmailId: '[email protected]' },
];
const fields = { text: 'Name' };
return (
<div>
<label>Comments</label>
<div id="commentBox" placeholder="Type @ to mention a user"></div>
<MentionComponent
target={mentionTarget}
dataSource={users}
fields={fields}
/>
</div>
);
}
export default App;#### Custom Trigger Character Use mentionChar to trigger with # instead of @:
<MentionComponent
target="#editor"
dataSource={tags}
mentionChar="#"
showMentionChar={true}
/>#### Remote Data with Filtering (security-first)
import { DataManager, ODataV4Adaptor, Query } from '@syncfusion/ej2-data';
// SECURITY: Do not call third-party endpoints from the browser. Use a server-side
// proxy that you control and that validates/sanitizes upstream responses.
const dataSource = new DataManager({
url: 'https://your-trusted-proxy.example/api/mentions',
adaptor: new ODataV4Adaptor(),
crossDomain: true,
});
const query = new Query().from('Customers').select(['ContactName', 'CustomerID']).take(6);
const fields = { text: 'ContactName', value: 'CustomerID' };
<MentionComponent
target="#editor"
dataSource={dataSource}
fields={fields}
query={query}
minLength={2}
popupWidth="250px" />#### Handling Selection Events
import { SelectEventArgs } from '@syncfusion/ej2-react-dropdowns';
function onSelect(args: SelectEventArgs) {
console.log('Selected item:', args.itemData);
console.log('Selected text:', args.text);
}
<MentionComponent
target="#editor"
dataSource={users}
fields={{ text: 'Name' }}
select={onSelect}
/>#### Popup Configuration
<MentionComponent
target="#editor"
dataSource={data}
fields={{ text: 'Name' }}
popupHeight="200px"
popupWidth="300px"
suggestionCount={10}
sortOrder="Ascending"
suffixText=" "
/>| Prop | Type | Default | Purpose | |
|---|---|---|---|---|
target | `string\ | HTMLElement` | — | CSS selector or element for the editable area |
dataSource | `array\ | DataManager` | [] | Data for suggestions |
fields | FieldSettingsModel | {text:null,value:null} | Maps data fields | |
mentionChar | string | '@' | Trigger character | |
showMentionChar | boolean | false | Prepend trigger char to inserted text | |
minLength | number | 0 | Min chars before search | |
suggestionCount | number | 25 | Max items in popup | |
filterType | FilterType | 'Contains' | Filter match strategy | |
allowSpaces | boolean | false | Allow spaces in search | |
sortOrder | SortOrder | 'None' | Sort direction | |
popupHeight | `string\ | number` | '300px' | Popup height |
popupWidth | `string\ | number` | 'auto' | Popup width |
suffixText | string | null | Text appended after selection | |
requireLeadingSpace | boolean | true | Space required before trigger char | |
highlight | boolean | false | Highlight search characters |
A comprehensive skill for implementing the MultiSelect Dropdown component — enabling users to select multiple values from a list with support for filtering, grouping, templates, checkboxes, chips, virtual scrolling, and more.
Installation: Pin packages to a specific major version to reduce supply-chain risk. ``bash npm install @syncfusion/ej2-react-dropdowns@^33.x.x @syncfusion/ej2-base@^33.x.x @syncfusion/ej2-buttons@^33.x.x @syncfusion/ej2-inputs@^33.x.x ``import { MultiSelectComponent } from '@syncfusion/ej2-react-dropdowns'; // ^33.x.x
import '@syncfusion/ej2-react-dropdowns/styles/tailwind3.css';
// Also import base dependencies:
// @syncfusion/ej2-base/styles/tailwind3.css
// @syncfusion/ej2-buttons/styles/tailwind3.css
// @syncfusion/ej2-inputs/styles/tailwind3.cssPackage: @syncfusion/ej2-react-dropdowns Main component: MultiSelectComponent Checkbox module: CheckBoxSelection (inject via <Inject services={[CheckBoxSelection]} />) Virtual scroll module: VirtualScroll (inject via <Inject services={[VirtualScroll]} />)
import { MultiSelectComponent } from '@syncfusion/ej2-react-dropdowns';
import * as React from 'react';
export default function App() {
const sportsData = ['Badminton', 'Basketball', 'Cricket', 'Football', 'Golf', 'Tennis'];
return (
<MultiSelectComponent
id="multiselect"
dataSource={sportsData}
placeholder="Select sports"
/>
);
}With objects and field mapping:
import { MultiSelectComponent } from '@syncfusion/ej2-react-dropdowns';
import * as React from 'react';
export default function App() {
const sportsData = [
{ id: 'game1', sports: 'Badminton' },
{ id: 'game2', sports: 'Football' },
{ id: 'game3', sports: 'Tennis' },
];
const fields = { text: 'sports', value: 'id' };
return (
<MultiSelectComponent
id="multiselect"
dataSource={sportsData}
fields={fields}
placeholder="Select a game"
/>
);
}#### Getting Started 📄 Read: references/getting-started.md
#### Data Binding 📄 Read: references/data-binding.md
text, value, groupBy, iconCss, disabled)DataManager (OData, OData V4, Web API)#### Grouping 📄 Read: references/grouping.md
groupBy#### Filtering 📄 Read: references/filtering.md
allowFilteringfiltering eventwhere() conditions#### Templates 📄 Read: references/templates.md
#### Selection Modes and Features 📄 Read: references/selection-and-features.md
CheckBoxSelection)tagging eventallowCustomValue)fields.disabledallowResize)VirtualScroll)#### Accessibility, Styling, and Localization 📄 Read: references/accessibility-styling-localization.md
L10n#### API Reference 📄 Read: references/api.md
| Prop | Type | When to Use | |||
|---|---|---|---|---|---|
dataSource | `string[] \ | object[] \ | DataManager` | Always required — data to display | |
fields | FieldSettingsModel | When using object data; map text, value, groupBy, disabled | |||
mode | `'Default' \ | 'Box' \ | 'CheckBox' \ | 'Delimiter'` | Change selection display: chips (Box), checkboxes, or comma-delimited |
value | `string[] \ | number[] \ | object[]` | Pre-select items on load | |
allowFiltering | boolean | Enable search-as-you-type filtering | |||
allowCustomValue | boolean | Let users type values not in the list | |||
allowObjectBinding | boolean | Return full objects as selected values instead of primitives | |||
enableVirtualization | boolean | Use for 500+ items to improve performance | |||
allowResize | boolean | Let users resize the popup | |||
popupHeight | string | Limit popup list height (default: 300px) | |||
popupWidth | string | Set popup width (default: matches input) | |||
placeholder | string | Input placeholder text |
Multi-tag input (chip display): → Use mode="Box" (default). Each selection becomes a chip.
Checkbox multi-selection: → Use mode="CheckBox" and inject CheckBoxSelection module.
Search/filter a long list: → Set allowFiltering={true} and handle the filtering event for remote data.
Pre-select values: → Pass value prop as an array of value-field values: value={['id1', 'id2']}.
Group by category: → Add groupBy to the fields prop: fields={{ text: 'name', value: 'id', groupBy: 'category' }}.
Large datasets (1000+ items): → Set enableVirtualization={true} and inject VirtualScroll module.
Disable specific options: → Add a boolean disabled column to your data and map it: fields={{ ..., disabled: 'isDisabled' }}.
Custom entry not in list: → Set allowCustomValue={true}; handle customValueSelection event for custom actions.
User wants multiple selections?
├── Visual chips with filter → mode="Box" (default) + allowFiltering
├── Checkbox-style list → mode="CheckBox" + Inject CheckBoxSelection
└── Comma-separated display → mode="Delimiter"
Data source type?
├── Simple strings/numbers → Pass array directly to dataSource
├── Objects → Pass array + fields={{ text, value }}
└── Remote API → Use DataManager + allowFiltering + filtering event
List is very long?
└── Yes (500+) → enableVirtualization={true} + Inject VirtualScroll
Need custom item layout?
└── Use itemTemplate, valueTemplate, groupTemplate props
Need localization?
└── Read references/accessibility-styling-localization.mdThe Syncfusion MultiColumnComboBoxComponent renders a combo box with a multi-column popup grid, enabling users to select from structured tabular data. It supports local and remote data, filtering, sorting, grouping, templates, virtualization, and full accessibility compliance.
Package: @syncfusion/ej2-react-multicolumn-combobox
#### Getting Started 📄 Read: references/getting-started.md
MultiColumnComboBoxComponentdataSource, fields, and columns with ColumnDirectivepopupHeight and popupWidth#### Columns 📄 Read: references/columns.md
ColumnDirective and ColumnsDirectivefield, header, width — core column propertiestextAlign for column text alignmenttemplate for cell-level custom renderingdisplayAsCheckBox for boolean columnscustomAttributes for column CSS customizationheaderTemplate for custom column headersformat for data formatting#### Data Binding 📄 Read: references/data-binding.md
dataSourceDataManager and WebApiAdaptorfields (text, value, groupBy)query property for filtered/limited data sets#### Filtering 📄 Read: references/filtering.md
allowFilteringfilterType (StartsWith, EndsWith, Contains)filtering event for custom filter logic#### Sorting 📄 Read: references/sorting.md
allowSortingsortOrder (None, Ascending, Descending)sortType (OneColumn, MultipleColumns)#### Grouping 📄 Read: references/grouping.md
fields.groupBygroupTemplate to customize group headers#### Templates 📄 Read: references/templates.md
itemTemplate for customizing each rowheaderTemplate (on ColumnDirective) for custom column headersgroupTemplate for group header customizationfooterTemplate for popup footer contentnoRecordsTemplate for empty state displayactionFailureTemplate for remote fetch error state#### Items and Configuration 📄 Read: references/items.md
text, value, indexplaceholder and floatLabelType for input label behaviorshowClearButton to allow clearing selectiondisabled and readonly stateswidth, popupWidth, popupHeight for sizingcssClass for custom stylinghtmlAttributes for additional HTML attributesgridSettings for grid lines, row height, and alternate rowsquery for data constraintsaddItems method, focusIn, focusOut, showPopup, hidePopup#### Virtualization 📄 Read: references/virtualization.md
enableVirtualization for large datasetsgridSettings.rowHeight#### Events 📄 Read: references/events.md
change — fired when value changes or item is selectedselect — fired on item selectionopen / close — popup open/close lifecyclefiltering — fired on character input for custom filteringactionBegin / actionComplete / actionFailure — data fetch lifecycle#### API Reference 📄 Read: references/api.md
addItems, focusIn, focusOut, getDataByValue, getItems, showPopup, hidePopupColumnModel propertiesGridSettingsModel propertiesFieldSettingsModel properties#### Accessibility 📄 Read: references/accessibility.md
role, aria-expanded, aria-selected, etc.)enableRtl#### Localization 📄 Read: references/localization.md
noRecordsTemplate text using L10nlocale property for culture-specific renderingimport { MultiColumnComboBoxComponent, ColumnsDirective, ColumnDirective } from '@syncfusion/ej2-react-multicolumn-combobox';
import * as React from 'react';
import './App.css';
// CSS in App.css:
// @import "../node_modules/@syncfusion/ej2-base/styles/tailwind3.css";
// @import "../node_modules/@syncfusion/ej2-inputs/styles/tailwind3.css";
// @import "../node_modules/@syncfusion/ej2-grids/styles/tailwind3.css";
// @import "../node_modules/@syncfusion/ej2-popups/styles/tailwind3.css";
// @import "../node_modules/@syncfusion/ej2-react-multicolumn-combobox/styles/tailwind3.css";
function App() {
const empData = [
{ EmpID: 1001, Name: 'Andrew Fuller', Designation: 'Team Lead', Country: 'England' },
{ EmpID: 1002, Name: 'Robert', Designation: 'Developer', Country: 'USA' },
{ EmpID: 1003, Name: 'Michael', Designation: 'HR', Country: 'Russia' },
];
const fields = { text: 'Name', value: 'EmpID' };
return (
<MultiColumnComboBoxComponent
id="multicolumn"
dataSource={empData}
fields={fields}
placeholder="Select an employee"
>
<ColumnsDirective>
<ColumnDirective field='EmpID' header='Employee ID' width={120} />
<ColumnDirective field='Name' header='Name' width={120} />
<ColumnDirective field='Designation' header='Designation' width={120} />
<ColumnDirective field='Country' header='Country' width={100} />
</ColumnsDirective>
</MultiColumnComboBoxComponent>
);
}
export default App;#### Pre-select an item by text
<MultiColumnComboBoxComponent dataSource={empData} fields={fields} text="Michael">
{/* columns */}
</MultiColumnComboBoxComponent>#### Enable filtering with Contains mode
<MultiColumnComboBoxComponent
dataSource={empData}
fields={fields}
allowFiltering={true}
filterType="Contains"
>
{/* columns */}
</MultiColumnComboBoxComponent>#### Enable sorting (descending) with multi-column support
import { SortOrder } from '@syncfusion/ej2-react-multicolumn-combobox';
<MultiColumnComboBoxComponent
dataSource={empData}
fields={fields}
allowSorting={true}
sortOrder={SortOrder.Descending}
sortType="MultipleColumns"
>
{/* columns */}
</MultiColumnComboBoxComponent>#### Handle value change event
<MultiColumnComboBoxComponent
dataSource={empData}
fields={fields}
change={(args) => console.log('Selected:', args.value)}
>
{/* columns */}
</MultiColumnComboBoxComponent>~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.