Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/hoaphantn7604/react-native-element-dropdown
A react-native dropdown component easy to customize for both iOS and Android.
https://github.com/hoaphantn7604/react-native-element-dropdown
components dropdown elements lazy-loading load-more material multiselect picker react-native select select-country
Last synced: 6 days ago
JSON representation
A react-native dropdown component easy to customize for both iOS and Android.
- Host: GitHub
- URL: https://github.com/hoaphantn7604/react-native-element-dropdown
- Owner: hoaphantn7604
- License: mit
- Created: 2021-06-22T18:50:00.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2024-10-11T08:41:44.000Z (2 months ago)
- Last Synced: 2024-10-15T05:31:15.071Z (2 months ago)
- Topics: components, dropdown, elements, lazy-loading, load-more, material, multiselect, picker, react-native, select, select-country
- Language: TypeScript
- Homepage:
- Size: 1.03 MB
- Stars: 964
- Watchers: 3
- Forks: 171
- Open Issues: 139
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
[](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-element-dropdown-demo.png)
# react-native-element-dropdown
React Native Element Dropdown is a library that provides a customizable dropdown component for React Native applications. This library simplifies the process of creating dropdown menus and provides a variety of options to customize the dropdown to match the design and functionality of your application.## Features
* Dropdown and Multiselect in one package
* Easy to use
* Consistent look and feel on iOS and Android
* Customizable font size, colors and animation duration
* Implemented with typescript```js
If you love this library, give us a star, you will be a ray of sunshine in our lives :)
```### Free React Native Boilerplate
[React Native Template](https://github.com/hoaphantn7604/react-native-template-components) with a beautiful UI.## Getting started
```js
npm install react-native-element-dropdown --save
```
or```js
yarn add react-native-element-dropdown
```
### Demo[](https://youtu.be/FhTDR_Ad_14)
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-drpdown.gif)
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-multiselect.gif)### Dropdown Props
| Props | Params | isRequire | Description |
| ------------------ | ----------------------------------------------- | --------- | ------------------------------------------------------------------- |
| mode | 'default' or 'modal' of 'auto' | No | Mode 'modal' is show the dropdown in the middle of the screen. |
| data | Array | Yes | Data is a plain array |
| labelField | String | Yes | Extract the label from the data item |
| valueField | String | Yes | Extract the primary key from the data item |
| searchField | String | No | Specify the field of data list you want to search |
| onChange | (item: object) => void | Yes | Selection callback |
| onChangeText | (search: string) => void | No | Callback that is called when the text input's text changes |
| value | Item | No | Set default value |
| placeholder | String | No | The string that will be rendered before dropdown has been selected |
| placeholderStyle | TextStyle | No | Styling for text placeholder |
| selectedTextStyle | TextStyle | No | Styling for selected text |
| selectedTextProps | TextProps | No | Text Props for selected text. Ex: numberOfLines={1} |
| style | ViewStyle | No | Styling for view container |
| containerStyle | ViewStyle | No | Styling for list container |
| maxHeight | Number | No | Customize max height for list container |
| minHeight | Number | No | Customize min height for list container |
| fontFamily | String | No | Customize font style |
| iconStyle | ImageStyle | No | Styling for icon |
| iconColor | String | No | Color of icons |
| itemContainerStyle | TextStyle | No | Styling for item container in list |
| itemTextStyle | TextStyle | No | Styling for text item in list |
| activeColor | String | No | Background color for item selected in list container |
| search | Boolean | No | Show or hide input search |
| searchQuery | (keyword: string, labelValue: string) => Boolean| No | Callback used to filter the list of items |
| inputSearchStyle | ViewStyle | No | Styling for input search |
| searchPlaceholder | String | No | The string that will be rendered before text input has been entered |
| searchPlaceholderTextColor | String | No | The text color of the placeholder string |
| renderInputSearch | (onSearch: (text:string) => void) => JSX.Element| No | Customize TextInput search |
| disable | Boolean | No | Specifies the disabled state of the Dropdown |
| dropdownPosition | 'auto' or 'top' or 'bottom' | No | Dropdown list position. Default is 'auto' |
| autoScroll | Boolean | No | Auto scroll to index item selected, default is true |
| showsVerticalScrollIndicator | Boolean | No | When true, shows a vertical scroll indicator, default is true |
| renderLeftIcon | (visible?: boolean) => JSX.Element | No | Customize left icon for dropdown |
| renderRightIcon | (visible?: boolean) => JSX.Element | No | Customize right icon for dropdown |
| renderItem | (item: object, selected: Boolean) => JSX.Element| No | Takes an item from data and renders it into the list |
| flatListProps | FlatListProps | No | Customize FlatList element |
| inverted | Boolean | No | Reverses the direction of scroll on top position mode. Default is true|
| onFocus | () => void | No | Callback that is called when the dropdown is focused |
| onBlur | () => void | No | Callback that is called when the dropdown is blurred |
| keyboardAvoiding | Boolean | No | keyboardAvoiding default is true |
| backgroundColor | String | No | Set background color |
| confirmSelectItem | Boolean | No | Turn On confirm select item. Refer example/src/dropdown/example3 |
| onConfirmSelectItem | (item: object) => void | No | Selection callback. Refer example/src/dropdown/example3 |
| testID | String | No | Used to locate this view in end-to-end tests |
| itemTestIDField | String | No | Add this field to the input data. Ex: DATA = [{itemTestIDField: '', label: '', value:: ''}]|
| accessibilityLabel | String | No | Set an accessibilityLabel on the view, so that people who use VoiceOver know what element they have selected |
| itemAccessibilityLabelField | String | No | Add this field to the input data. Ex: DATA = [{itemAccessibilityLabelField: '', label: '', value:: ''}]|
| closeModalWhenSelectedItem | Boolean | No | By default, closeModalWhenSelectedItem is set to true. When closeModalWhenSelectedItem is set to false, the Modal won't close when an item is selected. |
| excludeItems | Item[] | No | The array containing the items to be excluded. |
| excludeSearchItems | Item[] | No | The array containing the items to be excluded. |### MultiSelect Props
| Props | Params | isRequire | Description |
| ------------------ | -----------------------------------------------------| --------- | ------------------------------------------------------------------- |
| mode | 'default' or 'modal' of 'auto' | No | Mode 'modal' is show the dropdown in the middle of the screen. |
| data | Array | Yes | Data is a plain array |
| labelField | String | Yes | Extract the label from the data item |
| valueField | String | Yes | Extract the primary key from the data item |
| searchField | String | No | Specify the field of data list you want to search |
| onChange | (value[]) => void | Yes | Selection callback. A array containing the "valueField". |
| onChangeText | (search: string) => void | No | Callback that is called when the text input's text changes |
| value | Item[] | No | Set default value. A array containing the "valueField". |
| placeholder | String | No | The string that will be rendered before dropdown has been selected |
| placeholderStyle | TextStyle | No | Styling for text placeholder |
| style | ViewStyle | No | Styling for view container |
| containerStyle | ViewStyle | No | Styling for list container |
| maxHeight | Number | No | Customize max height for list container |
| minHeight | Number | No | Customize min height for list container |
| maxSelect | Number | No | maximum number of items that can be selected |
| fontFamily | String | No | Customize font style |
| iconStyle | ImageStyle | No | Styling for icon |
| iconColor | String | No | Color of icons |
| activeColor | String | No | Background color for item selected in list container |
| itemContainerStyle | TextStyle | No | Styling for item container in list |
| itemTextStyle | TextStyle | No | Styling for text item in list |
| selectedStyle | ViewStyle | No | Styling for selected view |
| selectedTextStyle | TextStyle | No | Styling for selected text |
| selectedTextProps | TextProps | No | Text Props for selected text. Ex: numberOfLines={1} |
| renderSelectedItem | (item: object, unSelect?: () => void) => JSX.Element | No | Takes an item from data and renders it into the list selected |
| alwaysRenderSelectedItem | Boolean | No | Always show the list of selected items |
| visibleSelectedItem | Boolean | No | Option to hide selected item list, Ẽx: visibleSelectedItem={false} |
| search | Boolean | No | Show or hide input search |
| searchQuery | (keyword: string, labelValue: string) => Boolean | No | Callback used to filter the list of items |
| inputSearchStyle | ViewStyle | No | Styling for input search |
| searchPlaceholder | String | No | The string that will be rendered before text input has been entered |
| searchPlaceholderTextColor | String | No | The text color of the placeholder string |
| renderInputSearch | (onSearch: (text:string) => void) => JSX.Element | No | Customize TextInput search |
| disable | Boolean | No | Specifies the disabled state of the Dropdown |
| dropdownPosition | 'auto' or 'top' or 'bottom' | No | Dropdown list position. Default is 'auto' |
| showsVerticalScrollIndicator | Boolean | No | When true, shows a vertical scroll indicator, default is true |
| renderLeftIcon | (visible?: boolean) => JSX.Element | No | Customize left icon for dropdown |
| renderRightIcon | (visible?: boolean) => JSX.Element | No | Customize right icon for dropdown |
| renderItem | (item: object, selected: Boolean) => JSX.Element | No | Takes an item from data and renders it into the list |
| flatListProps | FlatListProps | No | Customize FlatList element |
| inverted | Boolean | No | Reverses the direction of scroll on top position mode. Default is true|
| onFocus | () => void | No | Callback that is called when the dropdown is focused |
| onBlur | () => void | No | Callback that is called when the dropdown is blurred |
| keyboardAvoiding | Boolean | No | keyboardAvoiding default is true |
| inside | Boolean | No | inside default is false |
| backgroundColor | String | No | Set background color |
| confirmSelectItem | Boolean | No | Turn On confirm select item. Refer example/src/dropdown/example7 |
| confirmUnSelectItem | Boolean | No | Turn On confirm un-select item. Refer example/src/dropdown/example7 |
| onConfirmSelectItem | (item: any) => void | No | Selection callback. Refer example/src/dropdown/example7 |
| testID | String | No | Used to locate this view in end-to-end tests |
| itemTestIDField | String | No | Add this field to the input data. Ex: DATA = [{itemTestIDField: '', label: '', value:: ''}]|
| accessibilityLabel | String | No | Set an accessibilityLabel on the view, so that people who use VoiceOver know what element they have selected |
| itemAccessibilityLabelField | String | No | Add this field to the input data. Ex: DATA = [{itemAccessibilityLabelField: '', label: '', value:: ''}]|
| excludeItems | Item[] | No | The array containing the items to be excluded. |
| excludeSearchItems | Item[] | No | The array containing the items to be excluded. |### SelectCountry extends Dropdown
| Props | Params | isRequire | Description |
| ------------------ | -------------------- | --------- | ------------------------------------ |
| imageField | String | Yes | Extract the image from the data item |
| imageStyle | ImageStyle | No | Styling for image |### Method
| API | Params | Description |
| ----------- | ------------| ---------------------|
| open | () => void | Open dropdown list |
| close | () => void | Close dropdown list |### Dropdown example
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-dropdown-1.png)
```js
import React, { useState } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { Dropdown } from 'react-native-element-dropdown';
import AntDesign from '@expo/vector-icons/AntDesign';const data = [
{ label: 'Item 1', value: '1' },
{ label: 'Item 2', value: '2' },
{ label: 'Item 3', value: '3' },
{ label: 'Item 4', value: '4' },
{ label: 'Item 5', value: '5' },
{ label: 'Item 6', value: '6' },
{ label: 'Item 7', value: '7' },
{ label: 'Item 8', value: '8' },
];const DropdownComponent = () => {
const [value, setValue] = useState(null);
const [isFocus, setIsFocus] = useState(false);const renderLabel = () => {
if (value || isFocus) {
return (
Dropdown label
);
}
return null;
};return (
{renderLabel()}
setIsFocus(true)}
onBlur={() => setIsFocus(false)}
onChange={item => {
setValue(item.value);
setIsFocus(false);
}}
renderLeftIcon={() => (
)}
/>
);
};export default DropdownComponent;
const styles = StyleSheet.create({
container: {
backgroundColor: 'white',
padding: 16,
},
dropdown: {
height: 50,
borderColor: 'gray',
borderWidth: 0.5,
borderRadius: 8,
paddingHorizontal: 8,
},
icon: {
marginRight: 5,
},
label: {
position: 'absolute',
backgroundColor: 'white',
left: 22,
top: 8,
zIndex: 999,
paddingHorizontal: 8,
fontSize: 14,
},
placeholderStyle: {
fontSize: 16,
},
selectedTextStyle: {
fontSize: 16,
},
iconStyle: {
width: 20,
height: 20,
},
inputSearchStyle: {
height: 40,
fontSize: 16,
},
});
```### Dropdown example 1
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-dropdown-2.png)
```javascript
import React, { useState } from 'react';
import { StyleSheet } from 'react-native';
import { Dropdown } from 'react-native-element-dropdown';
import AntDesign from '@expo/vector-icons/AntDesign';const data = [
{ label: 'Item 1', value: '1' },
{ label: 'Item 2', value: '2' },
{ label: 'Item 3', value: '3' },
{ label: 'Item 4', value: '4' },
{ label: 'Item 5', value: '5' },
{ label: 'Item 6', value: '6' },
{ label: 'Item 7', value: '7' },
{ label: 'Item 8', value: '8' },
];const DropdownComponent = () => {
const [value, setValue] = useState(null);return (
{
setValue(item.value);
}}
renderLeftIcon={() => (
)}
/>
);
};export default DropdownComponent;
const styles = StyleSheet.create({
dropdown: {
margin: 16,
height: 50,
borderBottomColor: 'gray',
borderBottomWidth: 0.5,
},
icon: {
marginRight: 5,
},
placeholderStyle: {
fontSize: 16,
},
selectedTextStyle: {
fontSize: 16,
},
iconStyle: {
width: 20,
height: 20,
},
inputSearchStyle: {
height: 40,
fontSize: 16,
},
});
```### Dropdown example 2
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-dropdown-3.png)
```javascript
import React, { useState } from 'react';
import { StyleSheet, View, Text } from 'react-native';
import { Dropdown } from 'react-native-element-dropdown';
import AntDesign from '@expo/vector-icons/AntDesign';const data = [
{ label: 'Item 1', value: '1' },
{ label: 'Item 2', value: '2' },
{ label: 'Item 3', value: '3' },
{ label: 'Item 4', value: '4' },
{ label: 'Item 5', value: '5' },
{ label: 'Item 6', value: '6' },
{ label: 'Item 7', value: '7' },
{ label: 'Item 8', value: '8' },
];const DropdownComponent = () => {
const [value, setValue] = useState(null);const renderItem = item => {
return (
{item.label}
{item.value === value && (
)}
);
};return (
{
setValue(item.value);
}}
renderLeftIcon={() => (
)}
renderItem={renderItem}
/>
);
};export default DropdownComponent;
const styles = StyleSheet.create({
dropdown: {
margin: 16,
height: 50,
backgroundColor: 'white',
borderRadius: 12,
padding: 12,
shadowColor: '#000',
shadowOffset: {
width: 0,
height: 1,
},
shadowOpacity: 0.2,
shadowRadius: 1.41,elevation: 2,
},
icon: {
marginRight: 5,
},
item: {
padding: 17,
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
},
textItem: {
flex: 1,
fontSize: 16,
},
placeholderStyle: {
fontSize: 16,
},
selectedTextStyle: {
fontSize: 16,
},
iconStyle: {
width: 20,
height: 20,
},
inputSearchStyle: {
height: 40,
fontSize: 16,
},
});
```### MultiSelect example 1
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-multiselect-1.png)
```js
import React, { useState } from 'react';
import { StyleSheet, View } from 'react-native';
import { MultiSelect } from 'react-native-element-dropdown';
import AntDesign from '@expo/vector-icons/AntDesign';const data = [
{ label: 'Item 1', value: '1' },
{ label: 'Item 2', value: '2' },
{ label: 'Item 3', value: '3' },
{ label: 'Item 4', value: '4' },
{ label: 'Item 5', value: '5' },
{ label: 'Item 6', value: '6' },
{ label: 'Item 7', value: '7' },
{ label: 'Item 8', value: '8' },
];const MultiSelectComponent = () => {
const [selected, setSelected] = useState([]);return (
{
setSelected(item);
}}
renderLeftIcon={() => (
)}
selectedStyle={styles.selectedStyle}
/>
);
};export default MultiSelectComponent;
const styles = StyleSheet.create({
container: { padding: 16 },
dropdown: {
height: 50,
backgroundColor: 'transparent',
borderBottomColor: 'gray',
borderBottomWidth: 0.5,
},
placeholderStyle: {
fontSize: 16,
},
selectedTextStyle: {
fontSize: 14,
},
iconStyle: {
width: 20,
height: 20,
},
inputSearchStyle: {
height: 40,
fontSize: 16,
},
icon: {
marginRight: 5,
},
selectedStyle: {
borderRadius: 12,
},
});
```### MultiSelect example 2
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-multiselect-2.png)
```js
import React, { useState } from 'react';
import { StyleSheet, View, TouchableOpacity, Text } from 'react-native';
import { MultiSelect } from 'react-native-element-dropdown';
import AntDesign from '@expo/vector-icons/AntDesign';const data = [
{ label: 'Item 1', value: '1' },
{ label: 'Item 2', value: '2' },
{ label: 'Item 3', value: '3' },
{ label: 'Item 4', value: '4' },
{ label: 'Item 5', value: '5' },
{ label: 'Item 6', value: '6' },
{ label: 'Item 7', value: '7' },
{ label: 'Item 8', value: '8' },
];const MultiSelectComponent = () => {
const [selected, setSelected] = useState([]);const renderItem = item => {
return (
{item.label}
);
};return (
{
setSelected(item);
}}
renderLeftIcon={() => (
)}
renderItem={renderItem}
renderSelectedItem={(item, unSelect) => (
unSelect && unSelect(item)}>
{item.label}
)}
/>
);
};export default MultiSelectComponent;
const styles = StyleSheet.create({
container: { padding: 16 },
dropdown: {
height: 50,
backgroundColor: 'white',
borderRadius: 12,
padding: 12,
shadowColor: '#000',
shadowOffset: {
width: 0,
height: 1,
},
shadowOpacity: 0.2,
shadowRadius: 1.41,elevation: 2,
},
placeholderStyle: {
fontSize: 16,
},
selectedTextStyle: {
fontSize: 14,
},
iconStyle: {
width: 20,
height: 20,
},
inputSearchStyle: {
height: 40,
fontSize: 16,
},
icon: {
marginRight: 5,
},
item: {
padding: 17,
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
},
selectedStyle: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
borderRadius: 14,
backgroundColor: 'white',
shadowColor: '#000',
marginTop: 8,
marginRight: 12,
paddingHorizontal: 12,
paddingVertical: 8,
shadowOffset: {
width: 0,
height: 1,
},
shadowOpacity: 0.2,
shadowRadius: 1.41,elevation: 2,
},
textSelectedStyle: {
marginRight: 5,
fontSize: 16,
},
});
```### SelectCountry example 1
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-dropdown-4.png)
```js
import React, { useState } from 'react';
import { StyleSheet } from 'react-native';
import { SelectCountry } from 'react-native-element-dropdown';const local_data = [
{
value: '1',
lable: 'Country 1',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '2',
lable: 'Country 2',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '3',
lable: 'Country 3',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '4',
lable: 'Country 4',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '5',
lable: 'Country 5',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
];const SelectCountryScreen = _props => {
const [country, setCountry] = useState('1');return (
{
setCountry(e.value);
}}
/>
);
};export default SelectCountryScreen;
const styles = StyleSheet.create({
dropdown: {
margin: 16,
height: 50,
borderBottomColor: 'gray',
borderBottomWidth: 0.5,
},
imageStyle: {
width: 24,
height: 24,
},
placeholderStyle: {
fontSize: 16,
},
selectedTextStyle: {
fontSize: 16,
marginLeft: 8,
},
iconStyle: {
width: 20,
height: 20,
},
inputSearchStyle: {
height: 40,
fontSize: 16,
},
});
```### SelectCountry example 2
![](https://github.com/hoaphantn7604/file-upload/blob/master/document/dropdown/react-native-dropdown-5.png)
```js
import React, { useState } from 'react';
import { StyleSheet } from 'react-native';
import { SelectCountry } from 'react-native-element-dropdown';const local_data = [
{
value: '1',
lable: 'Country 1',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '2',
lable: 'Country 2',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '3',
lable: 'Country 3',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '4',
lable: 'Country 4',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
{
value: '5',
lable: 'Country 5',
image: {
uri: 'https://www.vigcenter.com/public/all/images/default-image.jpg',
},
},
];const SelectCountryScreen = _props => {
const [country, setCountry] = useState('1');return (
{
setCountry(e.value);
}}
/>
);
};export default SelectCountryScreen;
const styles = StyleSheet.create({
dropdown: {
margin: 16,
height: 50,
width: 150,
backgroundColor: '#EEEEEE',
borderRadius: 22,
paddingHorizontal: 8,
},
imageStyle: {
width: 24,
height: 24,
borderRadius: 12,
},
placeholderStyle: {
fontSize: 16,
},
selectedTextStyle: {
fontSize: 16,
marginLeft: 8,
},
iconStyle: {
width: 20,
height: 20,
},
});
```
[](https://github.com/hoaphantn7604)