![CodeQL](https://github.com/azeezat/react-native-select/actions/workflows/codeql.yml/badge.svg)
react-native-input-select
A fully customizable dropdown selection package for react-native android and iOS with multiple select and search capabilities.
Installation
With npm
npm install react-native-input-select
With yarn
yarn add react-native-input-select
Basic Usage
import React from 'react';
import Dropdown from 'react-native-input-select';
export default function App() {
const [country, setCountry] = React.useState();
return (
<Dropdown
label="Country"
placeholder="Select an option..."
options={[
{ label: 'Nigeria', value: 'NG' },
{ label: 'Åland Islands', value: 'AX' },
{ label: 'Algeria', value: 'DZ' },
{ label: 'American Samoa', value: 'AS' },
{ label: 'Andorra', value: 'AD' },
]}
selectedValue={country}
onValueChange={(value) => setCountry(value)}
primaryColor={'green'}
/>
);
}
Advanced Usage With Flat List
import React from 'react';
import Dropdown from 'react-native-input-select';
import { View, StyleSheet, Text, Button, Alert, Image } from 'react-native';
export default function App() {
const [country, setCountry] = React.useState();
return (
<Dropdown
label="Customized components in list"
placeholder="Select multiple options..."
options={[
{ name: 'Albania', code: 'AL' },
{ name: 'Nigeria', code: 'NG' },
{ name: 'Algeria', code: 'DZ' },
{ name: 'American Samoa', code: 'AS' },
{ name: 'Andorra', code: 'AD' },
{ name: 'Angola', code: 'AO' },
{ name: 'Anguilla', code: 'AI' },
{ name: 'Antarctica', code: 'AQ' },
{ name: 'Antigua and Barbuda', code: 'AG' },
]}
optionLabel={'name'}
optionValue={'code'}
selectedValue={country}
onValueChange={(itemValue: any) => setCountry(itemValue)}
isMultiple
primaryColor={'orange'}
dropdownStyle={{
borderWidth: 0, // To remove border, set borderWidth to 0
}}
placeholderStyle={{
color: 'purple',
fontSize: 15,
fontWeight: '500',
}}
labelStyle={{ color: 'teal', fontSize: 15, fontWeight: '500' }}
dropdownHelperTextStyle={{
color: 'green',
fontWeight: '900',
}}
modalBackgroundStyle={{
backgroundColor: 'rgba(196, 198, 246, 0.5)',
}}
helperText="The placeholder has been styled"
checkboxComponentStyles={{
checkboxSize: 20,
checkboxStyle: {
backgroundColor: 'purple',
borderRadius: 30, // To get a circle - add the checkboxSize and the padding size
padding: 10,
borderColor: 'blue',
},
checkboxLabelStyle: { color: 'red', fontSize: 20 },
}}
dropdownIcon={
<Image
style={styles.tinyLogo}
source={{
uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg==',
}}
/>
}
dropdownIconStyle={{ top: 20, right: 20 }}
listHeaderComponent={
<View style={styles.customComponentContainer}>
<Text style={styles.text}>
💡 You can add any component to the top of this list
</Text>
<View style={styles.fixToText}>
<Button
title="Left button"
onPress={() => Alert.alert('Left button pressed')}
color="#007AFF"
/>
<Button
title="Right button"
onPress={() => Alert.alert('Right button pressed')}
/>
</View>
</View>
}
listFooterComponent={
<View style={styles.customComponentContainer}>
<Text>You can add any component to the bottom of this list</Text>
</View>
}
modalOptionsContainerStyle={{ padding: 10, backgroundColor: 'cyan' }}
/>
);
}
const styles = StyleSheet.create({
customComponentContainer: {
paddingHorizontal: 20,
paddingVertical: 10,
},
text: {
marginBottom: 20,
},
fixToText: {
flexDirection: 'row',
justifyContent: 'space-between',
},
tinyLogo: {
width: 20,
height: 20,
},
});
Advanced Usage with Section List
<DropdownSelect
label="Menu"
placeholder="Select multiple dishes..."
options={[
{
title: 'Main dishes',
data: [
{ label: 'Pizza', value: 'A' },
{ label: 'Burger', value: 'B' },
{ label: 'Risotto', value: 'C' },
],
},
{
title: 'Sides',
data: [
{ label: 'Ice cream', value: 'D' },
{ label: 'Cheesecake', value: 'E' },
],
},
{
title: 'Drinks',
data: [
{ label: 'Water', value: 'F' },
{ label: 'Coke', value: 'G' },
{ label: 'Juice', value: 'H' },
],
},
]}
selectedValue={menu}
onValueChange={(itemValue: any) => setMenu(itemValue)}
isMultiple
isSearchable
primaryColor={'deepskyblue'}
listComponentStyles={{
sectionHeaderStyle: {
padding: 10,
backgroundColor: 'green',
color: 'white',
width: '30%',
},
}}
/>
For more examples visit our wiki page
iOS
Android
Props
Proptypes | Datatype | Example |
---|
label | string | Countries |
placeholder | string | Select a country |
options | Array | [{ name: 'Nigeria', code: 'NG' }, { name: 'Albania', code: 'AL' }] |
optionLabel | string | name |
optionValue | string | code |
error | string | This is a requiredfield |
helperText | string | Only few countries are listed |
selectedValue | string or Array | AL or [AL, AX] |
onValueChange | function | ()=>{} |
isMultiple | Boolean | true |
isSearchable | Boolean | true |
disabled | Boolean | true |
dropdownIcon | React Component | Image or <Text> Show <Text> |
labelStyle | Object | {color: 'red', fontSize: 15, fontWeight: '500'} |
placeholderStyle | Object | {color: 'blue', fontSize: 15, fontWeight: '500'} |
dropdownStyle | Object | {borderColor: 'blue', margin: 5, borderWidth:0 ...} |
dropdownContainerStyle | Object | {backgroundColor: 'red', width: '30%', ...} |
dropdownIconStyle | Object | {top: 10 , right: 10, ...} |
searchInputStyle | Object | {backgroundColor: 'red', borderRadius: 0, ...} |
selectedItemStyle | Object | {fontWeight: '600', color: 'yellow', ...} |
multipleSelectedItemStyle | Object | {backgroundColor: 'red', color: 'yellow', ...} |
modalBackgroundStyle | Object | {backgroundColor: 'rgba(196, 198, 246, 0.5)'} |
modalOptionsContainerStyle | Object | {padding: 10, backgroundColor: 'cyan',} |
modalProps | ReactNative.ModalProps | {supportedOrientations:{['landscape-left', landscape-right']} |
dropdownErrorStyle | Object | {borderWidth: 2, borderStyle: 'solid'} |
dropdownErrorTextStyle | Object | {color: 'red', fontWeight:'500'} |
dropdownHelperTextStyle | Object | {color: 'green', fontWeight:'500'} |
primaryColor | string | blue |
listHeaderComponent | React Component | <Text> You can add any component here </Text> |
listFooterComponent | React Component | <Text> You can add any component here <Text> |
hideModal | Boolean | Use this to hide the modal as needed |
listComponentStyles | Object | {listEmptyComponentStyle: ViewStyle, itemSeparatorStyle: ViewStyle, sectionHeaderStyle: TextStyle} |
checkboxComponentStyles | Object | {checkboxSize?: number, checkboxStyle?: ViewStyle, checkboxLabelStyle: TextStyle} |
Deprecation Notice
The following props would be removed in coming releases.
- Individual props
checkboxSize
, checkboxStyle
, checkboxLabelStyle
would be replaced with a single object checkboxComponentStyles
e.g
const checkboxComponentStyles = {
checkboxSize: 20,
checkboxStyle: {
backgroundColor: 'purple',
borderRadius: 30,
padding: 10,
borderColor: 'red',
},
checkboxLabelStyle: { color: 'red', fontSize: 20 },
};
Contributing
See the contributing guide to learn how to contribute to the repository and the development workflow.
Made with contrib.rocks.
License
MIT
Video Demo
https://github.com/azeezat/react-native-select/assets/9849221/194bf5cf-1a2d-4ca6-9585-05d6bb987aba