@react-native-picker/picker
라이브러리를 사용하는 것이 일반적입니다. 이 라이브러리는 기본적으로 Android, iOS, Windows, macOS를 모두 지원하며, 다양한 설정과 커스터마이징이 가능하여 널리 사용되고 있습니다.
이번 포스팅에서는 이 라이브러리를 설치하고 환경별 설정을 적용한 뒤, 실제로 Picker를 구현하는 과정을 하나하나 자세히 설명드리겠습니다.npm install @react-native-picker/picker --save
# 또는
yarn add @react-native-picker/picker
npx pod-install
AndroidManifest.xml
에 다음 항목을 추가할 수 있습니다.
만약 앱이 오른쪽에서 왼쪽으로 렌더링되는 경우(예: 아랍어 등)에는 이 설정이 필요합니다.<application
android:supportsRtl="true"
...>
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
로 감지할 수 있습니다.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
등의 속성도 사용할 수 있습니다.@react-native-picker/picker
라이브러리는 플랫폼 별 기본 UI 스타일을 따르기 때문에, @react-native-picker/picker
는 원하는 형태를 제공하지 못할 수 있습니다.
이럴 때는 react-native-element-dropdown↗ 라이브러리를 활용하면 iOS와 Android 모두에서 동일한 형태의 드롭다운 UI를 구현할 수 있습니다.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, 커스터마이징 강점 |
@react-native-picker/picker
react-native-element-dropdown
을 고려하는 것이 좋습니다.@react-native-picker/picker
는 React Native에서 플랫폼 간 호환이 뛰어난 드롭다운 UI를 구현할 수 있는 매우 유용한 라이브러리입니다. 간단한 설치와 다양한 설정 옵션 덕분에 초보자도 쉽게 사용할 수 있으며, 프로젝트 요구 사항에 따라 고급 기능까지 확장하여 사용할 수 있습니다.