PromleeBlog
sitemapaboutMe

posting thumbnail
React Native 드롭다운 커스텀 컴포넌트 만들기 (react-native-picker, react-native-element-dropdown)
React Native Create a Custom Dropdown Component (react-native-picker, react-native-element-dropdown)

📅

🚀

들어가기 전에🔗

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 설정🔗

iOS에서는 CocoaPods 설정이 필요합니다. 아래 명령어를 실행해 주세요.
npx pod-install

Android 설정🔗

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;
image
이처럼 간단한 코드로도 사용이 가능하며, 선택된 값은 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;
image
이 라이브러리는 labelField, valueField를 통해 어떤 데이터를 표시할지 직접 지정할 수 있고, 스타일링 유연성도 높아 디자인 커스터마이징이 수월합니다.

🚀

언제 어떤 라이브러리를 써야 할까?🔗

라이브러리iOS 지원 형태Android 지원 형태특징
@react-native-picker/picker다이얼로그 형태드롭다운/다이얼로그네이티브와 유사한 UX, 안정성 높음
react-native-element-dropdown드롭다운 형태드롭다운 형태크로스 플랫폼 일관된 UI, 커스터마이징 강점

🚀

결론🔗

@react-native-picker/picker는 React Native에서 플랫폼 간 호환이 뛰어난 드롭다운 UI를 구현할 수 있는 매우 유용한 라이브러리입니다. 간단한 설치와 다양한 설정 옵션 덕분에 초보자도 쉽게 사용할 수 있으며, 프로젝트 요구 사항에 따라 고급 기능까지 확장하여 사용할 수 있습니다.

참고🔗