npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

expo-react-native-multiple-select

v0.1.2

Published

Simple multi-select component for expo. Inspired on react-native-multiple-select

Readme

expo-react-native-multiple-select

A multi-select component for React Native and Expo, rewritten in TypeScript. Inspired by react-native-multiple-select.

Installation

npm install expo-react-native-multiple-select

Expo projects

No extra setup needed. The component uses @expo/vector-icons for icons, which is included in the Expo SDK.

Bare React Native projects

Install react-native-vector-icons as a fallback:

npm install react-native-vector-icons

Follow the react-native-vector-icons installation guide for native linking.

Custom icons

You can skip both icon libraries entirely by providing your own icons via IconComponent or renderIcon. See Custom Icons below.

Usage

Basic multi-select

import { useState } from 'react';
import MultiSelect from 'expo-react-native-multiple-select';

const items = [
  { _id: '1', name: 'JavaScript' },
  { _id: '2', name: 'TypeScript' },
  { _id: '3', name: 'Python' },
  { _id: '4', name: 'Go' },
];

export default function App() {
  const [selected, setSelected] = useState<string[]>([]);

  return (
    <MultiSelect
      items={items}
      selectedItems={selected}
      onSelectedItemsChange={setSelected}
      selectText="Pick languages"
      searchInputPlaceholderText="Search languages..."
      submitButtonText="Done"
    />
  );
}

Single select

<MultiSelect
  items={items}
  selectedItems={selected}
  onSelectedItemsChange={setSelected}
  single
  selectText="Pick one"
/>

Typed usage with custom keys

interface Fruit {
  id: string;
  label: string;
  disabled?: boolean;
}

const fruits: Fruit[] = [
  { id: 'apple', label: 'Apple' },
  { id: 'banana', label: 'Banana' },
  { id: 'cherry', label: 'Cherry', disabled: true },
];

<MultiSelect<Fruit>
  items={fruits}
  selectedItems={selected}
  onSelectedItemsChange={setSelected}
  uniqueKey="id"
  displayKey="label"
/>

Custom icons

Override all icons with a component:

import { Ionicons } from '@expo/vector-icons';

<MultiSelect
  items={items}
  selectedItems={selected}
  onSelectedItemsChange={setSelected}
  IconComponent={Ionicons}
/>

Or use a render function for full control:

<MultiSelect
  items={items}
  selectedItems={selected}
  onSelectedItemsChange={setSelected}
  renderIcon={({ name, size, color, style }) => (
    <MyCustomIcon name={name} size={size} color={color} style={style} />
  )}
/>

Override only the search icon:

<MultiSelect
  items={items}
  selectedItems={selected}
  onSelectedItemsChange={setSelected}
  searchIcon={<Ionicons name="search" size={20} color="#999" />}
/>

Imperative methods via ref

import { useRef } from 'react';
import MultiSelect from 'expo-react-native-multiple-select';
import type { MultiSelectHandle } from 'expo-react-native-multiple-select';

function MyComponent() {
  const ref = useRef<MultiSelectHandle>(null);

  return (
    <>
      <MultiSelect
        ref={ref}
        items={items}
        selectedItems={selected}
        onSelectedItemsChange={setSelected}
      />
      <Button title="Clear all" onPress={() => ref.current?._removeAllItems()} />
      <Button title="Toggle" onPress={() => ref.current?._toggleSelector()} />
    </>
  );
}

Add new items inline

<MultiSelect
  items={items}
  selectedItems={selected}
  onSelectedItemsChange={setSelected}
  canAddItems
  onAddItem={(updatedItems) => {
    // updatedItems includes the newly created item
    setItems(updatedItems);
  }}
/>

Props

Core

| Prop | Type | Default | Description | |------|------|---------|-------------| | items | T[] | required | Array of item objects | | selectedItems | (string \| number)[] | [] | Array of selected item keys | | onSelectedItemsChange | (items: (string \| number)[]) => void | required | Called when selection changes | | uniqueKey | string | '_id' | Property name used as unique identifier | | displayKey | string | 'name' | Property name used for display text | | single | boolean | false | Single-select mode |

Text

| Prop | Type | Default | |------|------|---------| | selectText | string | 'Select' | | selectedText | string | 'selected' | | searchInputPlaceholderText | string | 'Search' | | submitButtonText | string | 'Submit' | | noItemsText | string | 'No items to display.' |

Appearance

| Prop | Type | Default | |------|------|---------| | fontSize | number | 14 | | itemFontSize | number | 16 | | textColor | string | '#525966' | | tagBorderColor | string | '#00A5FF' | | tagTextColor | string | '#00A5FF' | | tagRemoveIconColor | string | '#C62828' | | selectedItemTextColor | string | '#00A5FF' | | selectedItemIconColor | string | '#00A5FF' | | itemTextColor | string | '#525966' | | submitButtonColor | string | '#CCC' |

Fonts

| Prop | Type | Default | |------|------|---------| | fontFamily | string | '' | | altFontFamily | string | '' | | selectedItemFontFamily | string | '' | | itemFontFamily | string | '' |

Layout

| Prop | Type | Default | Description | |------|------|---------|-------------| | fixedHeight | boolean | false | Fixed 250px dropdown height | | hideTags | boolean | false | Hide selected item tags | | hideSubmitButton | boolean | false | Hide submit button | | hideDropdown | boolean | false | Hide back arrow icon | | removeSelected | boolean | false | Hide already-selected items from list |

Search & Add

| Prop | Type | Default | Description | |------|------|---------|-------------| | canAddItems | boolean | false | Allow adding new items via search | | onAddItem | (items: T[]) => void | -- | Called with updated items array | | onChangeInput | (text: string) => void | -- | Called when search input changes | | filterMethod | 'partial' \| 'full' | 'partial' | Search filter strategy |

Callbacks

| Prop | Type | Description | |------|------|-------------| | onClearSelector | () => void | Called when selector closes via back arrow | | onToggleList | () => void | Called when selector opens or closes |

Icons

| Prop | Type | Description | |------|------|-------------| | searchIcon | ReactNode | Custom search icon (overrides all other icon resolution for search only) | | IconComponent | ComponentType<IconAdapterProps> | Custom icon component for all icons | | renderIcon | (props: IconAdapterProps) => ReactNode | Render function for all icons |

Icon resolution precedence: searchIcon (search only) > renderIcon > IconComponent > @expo/vector-icons > react-native-vector-icons.

Style overrides

| Prop | Type | |------|------| | tagContainerStyle | StyleProp<ViewStyle> | | styleMainWrapper | StyleProp<ViewStyle> | | styleSelectorContainer | StyleProp<ViewStyle> | | styleInputGroup | StyleProp<ViewStyle> | | styleItemsContainer | StyleProp<ViewStyle> | | styleListContainer | StyleProp<ViewStyle> | | styleDropdownMenu | StyleProp<ViewStyle> | | styleDropdownMenuSubsection | StyleProp<ViewStyle> | | styleRowList | StyleProp<ViewStyle> | | styleTextDropdown | StyleProp<TextStyle> | | styleTextDropdownSelected | StyleProp<TextStyle> | | styleTextTag | StyleProp<TextStyle> | | styleIndicator | StyleProp<TextStyle> | | searchInputStyle | StyleProp<TextStyle> |

Input passthrough

| Prop | Type | Description | |------|------|-------------| | textInputProps | Partial<TextInputProps> | Extra props for the search TextInput | | flatListProps | Partial<FlatListProps<T>> | Extra props for the items FlatList |

Ref methods

| Method | Description | |--------|-------------| | _removeAllItems() | Clear all selected items | | _removeItem(item) | Remove a specific item from selection | | _toggleSelector() | Open or close the dropdown | | getSelectedItemsExt(items?) | Returns a React element rendering selected item tags |

Migration from react-native-multiple-select

This package is a TypeScript rewrite of react-native-multiple-select. All legacy props and behaviors are preserved.

What changed:

  • Default icon library is @expo/vector-icons instead of react-native-vector-icons
  • Written in TypeScript with full type definitions
  • Functional component instead of class component
  • New IconComponent and renderIcon props for custom icon overrides
  • Generic type support: MultiSelect<T> for typed item objects
  • No lodash dependency

What stayed the same:

  • All prop names and default values
  • uniqueKey / displayKey pattern
  • Single-select and multi-select behavior
  • Search, filter, and add-item flows
  • Style override props
  • Ref methods (_removeAllItems, _removeItem, _toggleSelector, getSelectedItemsExt)

Minimal migration:

- import MultiSelect from 'react-native-multiple-select';
+ import MultiSelect from 'expo-react-native-multiple-select';

If you were using react-native-vector-icons directly and are now on Expo, no other changes are needed -- icons resolve automatically.

Exports

// Default export
import MultiSelect from 'expo-react-native-multiple-select';

// Named type exports
import type {
  MultiSelectProps,
  MultiSelectHandle,
  ItemType,
  IconAdapterProps,
  RenderIconFn,
} from 'expo-react-native-multiple-select';

// Color pack (for matching component theme)
import { colorPack } from 'expo-react-native-multiple-select';

Contributing

License

MIT