React Native에서 드롭다운 형태의 선택 UI를 구현하려면
@react-native-picker/picker
라이브러리를 사용하는 것이 일반적입니다. 이 라이브러리는 기본적으로 Android, iOS, Windows, macOS를 모두 지원하며, 다양한 설정과 커스터마이징이 가능하여 널리 사용되고 있습니다.
이번 포스팅에서는 이 라이브러리를 설치하고 환경별 설정을 적용한 뒤, 실제로 Picker를 구현하는 과정을 하나하나 자세히 설명드리겠습니다.
먼저 아래 명령어 중 하나를 실행하여 라이브러리를 설치합니다.
npm install @react-native-picker/picker --save
# 또는
yarn add @react-native-picker/picker
React Native 0.60 이상을 사용하는 경우에는 자동 연결(autolinking)을 지원하므로 별도의 linking 작업은 필요하지 않습니다.
0.60 미만의 버전을 사용하는 경우에는
React Native Autolinking↗ 문서를 참고하여 설정해주세요.
iOS에서는 CocoaPods 설정이 필요합니다. 아래 명령어를 실행해 주세요.
Android는 별도의 설정 없이 바로 사용할 수 있습니다. 다만, RTL(Right-to-Left) 지원을 위해
AndroidManifest.xml
에 다음 항목을 추가할 수 있습니다.
만약 앱이 오른쪽에서 왼쪽으로 렌더링되는 경우(예: 아랍어 등)에는 이 설정이 필요합니다.
< application
android:supportsRtl = "true"
...>
이제 Picker 컴포넌트를 실제로 사용하는 방법을 알아보겠습니다. 아래는 타입스크립트를 사용한 간단한 예제입니다.
import React, { useRef, useState } from "react" ;
import { Picker } from "@react-native-picker/picker" ;
const App = () => {
const pickerRef = useRef < any >();
const [ selected , setSelected ] = useState < string >();
return (
< Picker
ref ={ pickerRef }
selectedValue ={ selected }
onValueChange ={ ( itemValue ) => setSelected (itemValue) }
>
< Picker.Item label = "Java" value = "java" />
< Picker.Item label = "JavaScript" value = "js" />
< Picker.Item label = "Python" value = "python" />
< Picker.Item label = "C#" value = "c#" />
</ Picker >
);
};
export default App;
이처럼 간단한 코드로도 사용이 가능하며, 선택된 값은 selectedValue
속성으로 설정되고, 변경 이벤트는 onValueChange
로 감지할 수 있습니다.
Android에서는 Picker를 프로그래밍적으로 열거나 닫을 수도 있습니다. 아래는 useRef
를 활용한 예제입니다.
import React, { useRef, useState } from "react" ;
import { Picker } from "@react-native-picker/picker" ;
import { Button } from "react-native" ;
const App = () => {
const pickerRef = useRef < any >();
const [ selected , setSelected ] = useState < string >();
const open = () => pickerRef.current?. focus ();
const close = () => pickerRef.current?. blur ();
return (
<>
< Picker
ref ={ pickerRef }
selectedValue ={ selected }
onValueChange ={ ( itemValue ) => setSelected (itemValue) }
>
< Picker.Item label = "Java" value = "java" />
< Picker.Item label = "JavaScript" value = "js" />
</ Picker >
< Button title = "Open" onPress ={ open } />
< Button title = "Close" onPress ={ close } />
</>
);
};
export default App;
또한 각 Picker.Item
에는 label
, value
, enabled
, color
등의 속성을 지정할 수 있어 다양한 스타일링과 접근성 설정이 가능합니다.
속성명 설명 플랫폼 selectedValue 선택된 값 전체 onValueChange 값 변경 이벤트 전체 mode 'dialog' 또는 'dropdown' (Android 전용) Android itemStyle 아이템 스타일 지정 iOS, Windows enabled 선택 비활성화 여부 Android, Web, Windows dropdownIconColor 드롭다운 화살표 색상 Android selectionColor 선택 텍스트 색상 iOS
이 외에도 테스트용 testID
, 접근성용 contentDescription
, 스타일링용 style
, 여러 줄 제한용 numberOfLines
등의 속성도 사용할 수 있습니다.
🚀
iOS에서 드롭다운 UI로 구현하고 싶다면? 🔗
앞서 소개한
@react-native-picker/picker
라이브러리는 플랫폼 별 기본 UI 스타일을 따르기 때문에,
iOS에서는 드롭다운(dropdown)
형태가 아닌
다이얼로그(dialog)
형태로 나타납니다.
디자인상 드롭다운 UI가 꼭 필요한 경우라면,
@react-native-picker/picker
는 원하는 형태를 제공하지 못할 수 있습니다.
이럴 때는
react-native-element-dropdown↗ 라이브러리를 활용하면 iOS와 Android 모두에서 동일한 형태의 드롭다운 UI를 구현할 수 있습니다.
🚀
react-native-element-dropdown 설치 및 사용법 🔗
npm install react-native-element-dropdown
# 또는
yarn add react-native-element-dropdown
추가 설정은 필요 없으며, 설치 후 바로 사용할 수 있습니다.
아래는 기본적인 사용 예제입니다.
import React, { useState } from 'react' ;
import { View, StyleSheet } from 'react-native' ;
import { Dropdown } from 'react-native-element-dropdown' ;
const data = [
{ label: 'Java' , value: 'java' },
{ label: 'JavaScript' , value: 'js' },
{ label: 'Python' , value: 'python' },
{ label: 'C#' , value: 'c#' },
];
const App = () => {
const [ value , setValue ] = useState ( null );
return (
< View style ={ styles.container } >
< Dropdown
style ={ styles.dropdown }
placeholderStyle ={ styles.placeholderStyle } // 빈 상태의 텍스트 스타일
selectedTextStyle ={ styles.selectedTextStyle } // 선택된 텍스트 스타일
data ={ data } // 표시할 데이터
labelField = "label" // 표시할 데이터의 레이블 필드
valueField = "value" // 표시할 데이터의 값 필드
placeholder = "언어 선택" // 빈 상태의 텍스트
value ={ value } // 선택된 값
onChange ={ ( item ) => {
setValue (item.value); // 선택된 값 업데이트
} }
/>
</ View >
);
};
const styles = StyleSheet. create ({
container: { padding: 16 },
dropdown: {
height: 50 ,
borderColor: '#ccc' ,
borderWidth: 1 ,
borderRadius: 8 ,
paddingHorizontal: 12 ,
},
placeholderStyle: {
fontSize: 16 ,
color: '#999' ,
},
selectedTextStyle: {
fontSize: 16 ,
color: '#333' ,
},
});
export default App;
이 라이브러리는 labelField
, valueField
를 통해 어떤 데이터를 표시할지 직접 지정할 수 있고, 스타일링 유연성도 높아 디자인 커스터마이징이 수월합니다.
라이브러리 iOS 지원 형태 Android 지원 형태 특징 @react-native-picker/picker
다이얼로그 형태 드롭다운/다이얼로그 네이티브와 유사한 UX, 안정성 높음 react-native-element-dropdown
드롭다운 형태 드롭다운 형태 크로스 플랫폼 일관된 UI, 커스터마이징 강점
간단한 네이티브 선택 UI
가 필요하고, iOS에서 드롭다운이 아니어도 괜찮다면
→ @react-native-picker/picker
iOS에서도 드롭다운 UI가 꼭 필요하다면
→ react-native-element-dropdown
을 고려하는 것이 좋습니다.
@react-native-picker/picker
는 React Native에서 플랫폼 간 호환이 뛰어난 드롭다운 UI를 구현할 수 있는 매우 유용한 라이브러리입니다. 간단한 설치와 다양한 설정 옵션 덕분에 초보자도 쉽게 사용할 수 있으며, 프로젝트 요구 사항에 따라 고급 기능까지 확장하여 사용할 수 있습니다.