@elik56a/react-native-pickers

中文文档
1.0.0发布于 2026/11/09MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 8153

Fully customizable React Native pickers with zero native code: wheel, time, duration, date (calendar, range, wheel), month, week strip, expandable calendar, agenda and timeline (day and week view of events), date-time, select (with server search), country

原始使用文档
文档目录35 节
  1. Why this one
  2. Install
  3. Quick start
  4. Components
  5. Inline, in a sheet, or behind a field
  6. Designs: native on each platform
  7. Customize anything
  8. Good to know
  9. API at a glance
  10. WheelPicker<T>
  11. TimePicker
  12. MonthPicker, WeekStrip and ExpandableCalendar
  13. Timeline and Agenda
  14. ColorPicker
  15. Slider
  16. OtpField
  17. Rating
  18. DurationPicker
  19. DatePicker
  20. DateTimePicker
  21. SelectPicker<T> and SelectList<T>
  22. CountryPicker
  23. LanguagePicker
  24. PhoneField
  25. CurrencyPicker and AmountField
  26. TimeZonePicker
  27. HorizontalList<T>
  28. EmojiPicker
  29. Sheets, fields, BottomSheet, ActionSheet and Menu
  30. Utilities
  31. Platforms
  32. For AI assistants
  33. Learn more
  34. Contributing
  35. License

React Native Pickers

npm downloads bundle size CI license OpenSSF Scorecard

Every picker a React Native app needs, in one package with zero native code. Wheel, time, duration, date, month, week strip, expandable calendar, date range, date & time, select, country, phone number, time zone, segmented control, emoji and color pickers, a slider, a star rating and an OTP code input, plus bottom sheets, action sheets, menus and the form fields to put pickers in. Native on iOS, Android and the web, and every detail is yours to customize.

React Native Pickers on an iPhone and an Android phone side by side: a date range picker with prices, wheel and clock-dial time pickers, a searchable select, an emoji picker, a phone number field, a color picker, a duration picker, and light and dark mode

Documentation & live examples · Showcase · Quick start · llms-full.txt · Changelog

Why this one

  • Native on every platform. The iOS design on iPhone, Material Design on Android and a web design in the browser, from one code path. Prefer one look everywhere? Set design="ios" once.
  • Zero native code. Pure JavaScript on React Native core APIs. Works in Expo Go, bare React Native and React Native Web, ships in OTA updates. No Reanimated, Gesture Handler or SVG.
  • Yours to customize. Theme tokens with automatic dark mode, a style slot for every visual part, and render props for full control. Your settings always win over the design.
  • Built for forms. Every picker comes inline, in a bottom sheet or modal with Cancel / Done, and as a form field that opens it and shows the value, with error and helper text from React Hook Form, Formik or Zod.
  • Real features built in. Date ranges with min/max nights, multiple dates, marked dates and prices, searchable selects with server search, a country picker with flags and dialing codes, a phone number field, a time zone picker, 1,923 emojis with skin tones and recents.
  • International and accessible. Names, the 12/24h clock and the week start come from Intl for any locale; layouts flip for RTL. VoiceOver and TalkBack support throughout, and full keyboard use on the web.
  • Typed. Generic value types and mode-discriminated unions: mode="range" gives you a typed { start, end }.

Install

npm install @elik56a/react-native-pickers

Or yarn add, pnpm add, npx expo install. Needs react >= 18 and react-native >= 0.72. Nothing else: no pod install, no rebuild, no config plugin.

Quick start

import { useState } from 'react';
import { View } from 'react-native';
import {
  DatePickerField,
  SelectPicker,
  TimePickerField,
} from '@elik56a/react-native-pickers';
import type { DateRange } from '@elik56a/react-native-pickers';

const ROOMS = [
  { label: 'Single', value: 'single' },
  { label: 'Double', value: 'double' },
  { label: 'Suite', value: 'suite' },
];

export default function Booking() {
  const [stay, setStay] = useState<DateRange>({ start: null, end: null });
  const [arrival, setArrival] = useState<Date | undefined>();
  const [room, setRoom] = useState<string | null>(null);

  return (
    <View style={{ gap: 16, padding: 16 }}>
      <DatePickerField
        label="Stay"
        mode="range"
        value={stay}
        onConfirm={setStay}
        minDate={new Date()}
        placeholder="Add dates"
      />
      <TimePickerField
        label="Arrival"
        value={arrival}
        onConfirm={setArrival}
        minuteInterval={15}
      />
      <SelectPicker
        label="Room"
        options={ROOMS}
        value={room}
        onChange={setRoom}
      />
    </View>
  );
}

Each field opens its picker in a bottom sheet on iOS and Android and in a dropdown on the web, in that platform's design, and shows the confirmed value formatted for the locale.

Components

ComponentWhat it is
WheelPicker3D scrolling wheel: infinite loop, disabled items, tap-to-type
MultiWheelPickerSeveral wheels sharing one selection band: durations, units, compound values
TimePickerWheels, a Material clock dial or columns to click; 12h / 24h from locale, intervals, min / max
TimeRangePickerA start and an end time: opening hours, shifts, overnight ranges, min / max length
DatePickerCalendar (single, range, multiple, several ranges) or day / month / year wheels
MonthPickerA month and year, like a card's expiry: wheels on iOS, a grid of months in Material and on the web
WeekStripOne week of days in a row, with marked days; swipe or arrows to change weeks
ExpandableCalendarA week that opens into its month with a drag down or its handle, for schedule screens
TimelineA day or week view: events by the hour, overlaps side by side, all-day events, a now line and tap to add
AgendaEvents as a list day by day: iOS sticky day bands or Google Calendar's schedule, in step with a calendar
DurationPickerA length of time, like a timer or a workout: wheels, Material number boxes or columns to click, the value in seconds
DateTimePickerDay and time together: one row of wheels, or a calendar with the time under or beside it
SelectPickerField that opens a searchable list: single or multi-select, chips, groups, icons, server search, new options from the search
SelectListThe same list, inline
CountryPickerAbout 250 countries with flags and dialing codes, localized names, preferred countries on top
LanguagePicker86 languages with flags, each under its own name (Español, 日本語) with its name in the user's language below, right-to-left detection
PhoneFieldPhone number input: a country code button, the number formatted as it's typed, an E.164 value
CurrencyPicker154 currencies with flags, codes and symbols, names in the user's language, search by name, code or symbol
AmountFieldMoney input grouped as it's typed in the locale's format, the currency's decimal places, a currency button, a large amount for checkout screens
TimeZonePickerEvery IANA time zone with its GMT offset, sorted by offset, the device's zone on top
HorizontalListSegmented control or chips that scroll sideways and reveal the next item
ColorPickeriOS's Grid / Spectrum / Sliders, Google's swatch circles, or the browser's spectrum; hex with opacity and a copy button
SlideriOS's knob, Material 3's handle with a value bubble, or a range input; one thumb or a range, steps, icons
OtpFieldA verification code in a box per character: SMS autofill on iOS, Android and the web, paste, a PIN mode
RatingStar rating: tap or drag, half steps, a read-only score with any fraction, your own icon
EmojiPicker1,923 emojis: categories, search, skin tones (long-press for one emoji's), recents, version filtering
BottomSheetAnimated sheet with drag-to-dismiss, for your own content
MenuA dropdown or long-press context menu of actions by its trigger; pure JS, so it runs in Expo Go and on the web
ActionSheetA list of actions such as Share or Delete: iOS cards or Material rows, destructive and disabled actions
Picker sheetsDatePickerSheet, TimePickerSheet, TimeRangePickerSheet, DateTimePickerSheet, DurationPickerSheet, MonthPickerSheet, ColorPickerSheet, WheelPickerSheet, EmojiPickerSheet: a picker in a sheet with Cancel / Done
Picker fieldsDatePickerField, TimePickerField, TimeRangePickerField, DateTimePickerField, DurationPickerField, MonthPickerField, ColorPickerField, WheelPickerField, EmojiPickerField, PickerField: a form field that opens the picker

Inline, in a sheet, or behind a field

Every picker comes three ways, with the same props.

// Inline: changes as the user scrolls or taps
<DatePicker value={date} onChange={setDate} />

// In a sheet: keeps a draft, commits on Done, discards on Cancel
<DatePickerSheet
  visible={open}
  onClose={() => setOpen(false)}
  value={date}
  onConfirm={setDate}
/>

// Behind a field: owns the open state, shows the confirmed value
<DatePickerField label="Date" value={date} onConfirm={setDate} />

Sheets open as a bottom sheet, or as a centered modal on wide web windows (presentation="bottomSheet" | "modal"). Fields and SelectPicker also open as a dropdown under the field, their default on the web (presentation="dropdown"), or expand inline under it, pushing the content below, like the iOS Settings app (presentation="inline"). PickerField wraps any sheet of your own in a field.

Button text is yours too: confirmLabel, cancelLabel and showCancel on any sheet or field.

Designs: native on each platform

By default each platform gets its own design (design="auto"). A design changes shapes and layout, never your colors:

iosmaterialweb
Fieldslabel aboveoutlined, the label floats onto the borderlabel above, compact, focus ring
Cancel / confirmbeside a centered title, Doneafter the content, OKafter the content, Done
Single select✓ beside the chosen optiona radio on every option✓ beside the chosen option
Calendarchosen day tintedchosen day filled, today ringedchosen day a filled square
Timewheelsa clock dialcolumns of hours and minutes to click
Date & timeone row of wheelscalendar, time fields under itcalendar, time columns beside it
Pressdimsrippledims

Pick one design for the whole app, or for one component:

// The iOS look on Android and the web too
<PickersProvider design="ios">
  <App />
</PickersProvider>

// One component
<TimePicker design="material" value={time} onChange={setTime} />

Or keep the design and change one choice with its own prop: display="wheel" on TimePicker, timeDisplay and timePosition on DateTimePicker, confirmLabel on any sheet. See the designs guide.

Upgrading from 0.10? Android and the web now get the Material and web designs. Set <PickersProvider design="ios"> to keep the previous look everywhere.

Upgrading from 0.12? EmojiPicker follows the design too: on iOS and Android its category bar moves to the bottom, like the platform's emoji keyboard. Set categoryBarPosition="top" to keep it on top.

Customize anything

Theme your whole app once. It's optional: light and dark defaults follow the OS.

import { PickersProvider } from '@elik56a/react-native-pickers';

<PickersProvider
  colorScheme="auto" // 'auto' | 'light' | 'dark'
  design="auto" // 'auto' | 'ios' | 'material' | 'web'
  theme={{
    colors: { primary: '#FF5A5F' },
    radius: { md: 8 },
    typography: { fontFamily: 'Inter' },
  }}
  darkTheme={{
    colors: { primary: '#FF8A8E', background: '#000' },
  }}
>
  <App />
</PickersProvider>
Token groupKeys
colorsbackground surface sheet text textSecondary textDisabled primary onPrimary primaryMuted border backdrop indicator handle hover ripple danger
radiussm md lg full sheet
spacingxs sm md lg xl
typographyfontFamily fontFamilyMedium sizes weights
animationduration

Any component also takes theme and design for a local override.

Slot styles reach every visual part, so you never fork:

<DatePicker
  styles={{
    selectedDay: { borderRadius: 8 },
    dayText: { fontFamily: 'Inter' },
    rangeBand: { backgroundColor: '#FFE4E6' },
  }}
/>

Render props replace a part and keep its behavior and accessibility:

ComponentRender props
WheelsrenderItem, renderIndicator
HorizontalListrenderItem, renderArrow
CalendarrenderDay, renderArrow
SelectPicker, SelectListrenderOption, renderGroupHeader, renderLoading, renderTrigger, renderChevron
EmojiPickerrenderEmoji
RatingrenderIcon
FieldsrenderTrigger, renderChevron

Good to know

  • Controlled or uncontrolled. Pass value + onChange, or defaultValue. SelectPicker, SelectList and HorizontalList are controlled-only: update value in onChange.

  • onChange is for user changes only. Setting value in code moves the picker silently. Wheels fire onChange when they settle and onValueChanging on every row, and Slider on release and on every step, which is the place for haptics.

  • Sheets commit on Done. onConfirm gets the value; Cancel, the backdrop and dragging down discard the draft.

  • Fast under load. Drags, scrolls and animations run on the UI thread, so they stay at 60 fps while JavaScript is busy. See the benchmarks against @gorhom/bottom-sheet, Quidone's wheel picker and react-native-calendars.

  • Dates are local time. Days are compared by local year, month and day. Serialize them with toDateKey(date) ('YYYY-MM-DD'), not toISOString().

  • Smaller native bundles. Metro doesn't tree-shake, so on native, import from a feature subpath (React Native 0.79+):

    import { DatePicker } from '@elik56a/react-native-pickers/date';
    

    Subpaths: /wheel /time /duration /date /calendar /month /datetime /select /country /timezone /list /emoji /color /slider /rating /otp /action /sheet /core.

API at a glance

The full API reference lists every prop. These are the ones you'll reach for.

WheelPicker<T>

PropTypeDefault
items(T | { label, value, disabled? })[]
valueT
onChange(value, index) => void, when the wheel settles
onValueChanging(value, index) => void, on every row
loopbooleanfalse
itemHeightnumber40
visibleItemsnumber (odd)5
variant'3d' | 'flat''3d'
keyboardInputboolean: tap the selected row to typetrue
isEqual(a, b) => boolean, for object valuesObject.is

MultiWheelPicker takes columns: { key, items, value, onChange, flex?, width?, loop?, suffix? }[] and an optional separator.

TimePicker

PropTypeDefault
valueDate (the date part is kept)now
onChange(date) => void
display'wheel' | 'dial' | 'input' | 'list'from the design
format'12h' | '24h' | 'auto''auto', from locale
minuteIntervalnumber1
showSecondsbooleanfalse
minTime / maxTimeDate (time of day)
localestringdevice

MonthPicker, WeekStrip and ExpandableCalendar

MonthPicker picks a month and year; the value is a Date on the first of the month. Wheels on iOS, a grid of months under the year in Material and on the web (display), with minDate / maxDate, yearRange, monthFormat and locale. MonthPickerField shows October 2026.

WeekStrip is one week of days in a row: value, onChange(date), swipe or arrows to page, onWeekChange(weekStart), and the calendar's markedDates, minDate / maxDate, isDateDisabled, firstDayOfWeek and renderDay.

ExpandableCalendar is a WeekStrip that opens into its month with a drag down or the handle under it, and folds back into the week of the day picked: the same props, plus expanded / defaultExpanded / onExpandedChange and onMonthChange.

Timeline and Agenda

Both take one flat array of events, { id, title, start: Date, end: Date, allDay?, color?, subtitle? }, extended with your own fields as you like.

Timeline is a calendar's day view, or up to a week side by side (numberOfDays): events placed by the hour, side by side where they overlap, all-day events over the grid and a line at the current time. A swipe pages by days (date / onDateChange), onEventPress opens an event and onSlotPress({ start, end }) adds one where the grid was tapped. startHour, endHour, hourHeight, format and renderEvent shape it.

Agenda lists the same events day by day: a sticky band per day on iOS, the date beside each day's events in Material and on the web. It scrolls to selectedDate and reports the day at the top with onVisibleDateChange, so it stays in step with an ExpandableCalendar above it.

const [day, setDay] = useState(new Date());

<ExpandableCalendar value={day} onChange={setDay} />
<Agenda events={events} selectedDate={day} onVisibleDateChange={setDay} style={{ flex: 1 }} />
// or a day view
<Timeline events={events} date={day} onDateChange={setDay} onSlotPress={addEvent} style={{ flex: 1 }} />

ColorPicker

PropTypeDefault
valuehex string, such as '#E4572E''#2196F3'
onChange(color) => void, with '#RRGGBB'
display'tabs' | 'swatches' | 'spectrum'from the design
colors(string | { value, label? })[]24 named colours
showCustomboolean: the grid, spectrum, sliders and hex fieldtrue
showAlphaboolean: an opacity slider, '#RRGGBBAA' valuesfalse
onCopy(hex) => unknown: the copy button; the browser's clipboard on the web

ColorPickerField shows a swatch and the hex code.

Slider

PropTypeDefault
valuenumber, or [number, number] with rangemin
onChange(value) => void: on release, or a key or screen-reader step
onValueChanging(value) => void: every step while dragging
min / max / stepnumber; step={0} for any value0 / 100 / 1
rangeboolean: two thumbsfalse
showStepsboolean: a dot per stepfalse
marks / snapToMarks(number | { value, label? })[]: dots with labels / only the marks can be picked/ false
valueLabel'never' | 'drag' | 'always': the value bubble'drag' in Material
minimumIcon / maximumIconReactNode beside the track

OtpField

PropTypeDefault
valuestring: the code so far''
onChange(code) => void: as the user types, deletes or pastes
onComplete(code) => void: once the last cell is filled
lengthnumber6
inputMode'numeric' | 'text''numeric'
secureTextEntryboolean: dots, for a PINfalse
error / helperTextstring | boolean / string: red boxes, the message under them

Rating

PropTypeDefault
valuenumber0
onChange(value) => void: on a tap, the end of a drag, or a key step
max / stepnumber; step={0.5} for half stars5 / 1
readOnlyboolean: shows any fraction, no touchesfalse
size / color / emptyColorstar size and colours32 / gold / theme border
renderIcon({ index, filled, color, size }) => ReactNode★

DurationPicker

A length of time, such as a timer or a workout, rather than a time of day. The value is a number of seconds.

PropTypeDefault
valuenumber (seconds)0
onChange(seconds) => void
display'wheel' | 'input' | 'list'from the design
showHours / showSecondsbooleantrue / false
min / maxnumber (seconds)0 / 23 h 59 min 59 s
minuteInterval / secondIntervalnumber1
labels{ hours?, minutes?, seconds? }h, min, s

DurationPickerField shows the confirmed duration as 1 h 30 min, and formatDuration(seconds) writes it the same way.

DatePicker

modevalueonChangeExtra props
'single' (default)Date | null(date)
'range'{ start, end }(range)minRangeDays maxRangeDays allowSingleDayRange presets
'multiple'Date[](dates)maxSelections
'ranges'DateRange[](ranges)maxRanges
PropTypeDefault
display'calendar' | 'wheel''calendar'
minDate / maxDateDate
isDateDisabled(date) => boolean
markedDates{ 'YYYY-MM-DD': { dots?, label?, textColor?, disabled? } }
localestringdevice
firstDayOfWeek0–6 (0 = Sunday)from locale
onMonthChange(month) => void

DateTimePicker

PropTypeDefault
valueDatenow
onChange(date) => void
display'wheel' | 'calendar''wheel' in the iOS design, else 'calendar'
minDate / maxDateDate (date and time)
timePosition'beside' | 'below''beside' on the web
timeDisplay'wheel' | 'dial' | 'input' | 'list'from the design
minuteIntervalnumber1
calendarPropscalendar props such as markedDates

SelectPicker<T> and SelectList<T>

PropTypeDefault
options{ label, value, description?, icon?, group?, disabled?, keywords? }[][]
valueT | null, or T[] with multiple
onChange(value, option) => void
multipleboolean, with maxSelected and chipsfalse
searchablebooleanmore than 8 options
loadOptions(query) => Promise<options>: search a server
clearable / onClearboolean / () => voidfalse
error / helperText / requiredstring | boolean / string / boolean: the field turns red with the message under it
presentation'auto' | 'bottomSheet' | 'modal' | 'dropdown' | 'inline''auto': dropdown on the web

loadOptions waits for a pause in typing, shows a loader and ignores answers to older queries:

<SelectPicker
  label="City"
  loadOptions={(query) => api.searchCities(query)}
  value={city}
  onChange={setCity}
/>

CountryPicker

A SelectPicker with about 250 countries built in. The value is the ISO code ('IL'), and search matches English and native names, ISO codes and dialing codes.

PropTypeDefault
value / onChangeCountryCode, or CountryCode[] with multiple
preferredCountryCode[]: pinned on top
countries / excludeCountryCode[]all
showDialCodebooleanfalse
localestring: names via Intl.DisplayNames, English fallbackdevice locale

getCountry('IL') returns { code, name, nativeName, dialCode, flag, keywords }.

LanguagePicker

A SelectPicker with 86 languages built in, for an app's language setting. Each shows under its own name, such as Español, with its name in the user's language below. The value is a BCP 47 tag ('es', 'pt-BR', 'zh-Hant').

PropTypeDefault
value / onChangeLanguageCode, or LanguageCode[] with multiple
preferredLanguageCode[]: pinned on top
languages / excludeLanguageCode[]all
localestring: names via Intl.DisplayNames, English fallbackdevice locale
showFlag / flagsboolean / { en: 'GB' } to change some flagstrue

isRtlLanguage('ar-EG') tells whether a language is written right to left, and getLanguage('he') returns { code, name, nativeName, country, rtl }.

PhoneField

A phone number input: a flag and calling code button that opens the country list, then the number, grouped the way the country writes it. The value is E.164 ('+972541234567'); a pasted +44… number switches the country.

PropTypeDefault
value / onChangestring (E.164), onChange(value, { country, nationalNumber, valid })
country / defaultCountry / onCountryChangeCountryCode'US'
preferred / countries / exclude / localeas CountryPicker
label / placeholderstringan example in the country's format

parsePhone('+44 7911 123456') returns { country: 'GB', nationalNumber: '7911123456' }.

CurrencyPicker and AmountField

CurrencyPicker is a SelectPicker with 154 currencies built in, each with its flag, code and symbol; the value is an ISO 4217 code ('EUR'). AmountField is a money input: the amount grouped as it's typed in the locale's format ($1,234.50, 1.234,50 €), with the currency's decimal places. The value is a number, or null when empty.

PropTypeDefault
value / onChangenumber | null
currency / defaultCurrency / onCurrencyChangeCurrencyCode'USD'
variant'field', or 'large': big and centered, for checkout and send-money screens'field'
showCurrencyPickerboolean: a flag and code button that opens CurrencyPickerfalse
localestring: separators and the symbol's sidedevice locale

getCurrency('JPY') returns { code, name, symbol, decimals, country }; decimals turns an amount into minor units.

TimeZonePicker

A SelectPicker with every IANA time zone built in, each with its city, GMT offset and name, sorted by offset with the device's zone on top. The value is the IANA name ('Europe/Lisbon'); old names like 'Asia/Calcutta' are accepted and reported as the new ones.

PropTypeDefault
value / onChangestring, or string[] with multiple
preferredstring[]: pinned on topthe device's zone
timeZonesstring[]all
dateDate: the moment offsets are fornow

getDeviceTimeZone(), getTimeZoneOffset(id) (minutes) and formatGmtOffset(330) → 'GMT+5:30' are exported too.

HorizontalList<T>

PropTypeDefault
items{ label, value, disabled?, icon? }[]
valueT
onChange(value, item) => void
variant'segmented' | 'chips''segmented'
iconPosition'left' | 'right' | 'top' | 'bottom''left'
showArrowsboolean: ‹ › buttons that scroll the listfalse
arrowPosition'outside' | 'overlay': beside the list or over its edges'outside'

EmojiPicker

PropTypeDefault
onSelect(emoji, data) => void
columns / heightnumber8 / 380
categories / excludewhich to show, in order / characters to hideall
maxEmojiVersionnumber: hide emojis older devices can't render
skinTone / onSkinToneChange0–5, from the ✋ button; a long press picks one emoji's tone0
recent / onRecentChangestring[]: persist with your own storage[]
categoryBarPosition'auto' | 'top' | 'bottom': auto is bottom on iOS and Android, top on the web'auto'

Sheets, fields, BottomSheet, ActionSheet and Menu

ComponentProps
Picker sheetsvisible onClose value onConfirm title confirmLabel cancelLabel showCancel presentation sheetProps, plus the picker's props
Picker fieldsthe sheet's props without visible, plus label placeholder displayValue clearable onClear disabled error helperText required presentation renderTrigger renderChevron
BottomSheetvisible onClose title headerLeft headerRight footer height enableSwipeToClose expandable showHandle presentation
ActionSheetvisible onClose actions ({ label, onPress, description, icon, selected, destructive, disabled }) title message showCancel cancelLabel presentation; onPress runs after the sheet closes
Menuactions children (the trigger, or ({ open }) => …) title align width presentation ('menu' | 'sheet') openOnLongPress disabled onOpen onClose
useActionSheet()returns { show, hide, actionSheet }: render actionSheet once and call show({ title, actions }) from any handler, no provider

Utilities

AreaExports
DatestoDateKey addDays addMonths isSameDay formatDate getRangePresets
TimesformatTimeRange getTimeRangeSeconds formatDuration
Countries, phones, time zonesgetCountry parsePhone isValidPhone toE164 getDeviceTimeZone formatGmtOffset
ColoursnormalizeHex hexToHsv hsvToHex withAlpha
EmojigetAllEmojis searchEmojis findEmoji withSkinTone
ThemeusePickerTheme createTheme resolveDesign
SheetsuseDraft: draft state for your own sheets

Platforms

PlatformSupport
Expo Go, dev builds, EAS✅
Bare React Native (iOS, Android), New Architecture, Hermes✅
React Native Web, Expo Router web, Next.js✅
Windows, macOSUntested; core components only, uses the Material design

To preview iOS or Android behavior in a browser (Storybook, a design system), set <PickersProvider platform="ios">.

For AI assistants

The complete documentation is one Markdown file, llms-full.txt, with an index at llms.txt. It also ships inside the package at node_modules/@elik56a/react-native-pickers/llms-full.txt, matching the installed version. A short cheat sheet for code generation is on the For AI assistants page.

Learn more

Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md for setup, the example app and the docs site.

Emoji data comes from emojibase (MIT).

License

MIT © Eliyahu Kriel

版本与发布记录

@elik56a/react-native-pickers 共发布 41 个版本,首次发布于 2026/10/26;过去 12 个月发布了 41 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.0.0latest2026/11/094 天前
0.30.12026/11/0211 天前
0.30.02026/11/0211 天前
0.29.02026/11/0112 天前
0.28.02026/10/3014 天前
0.27.02026/10/3014 天前

关于 @elik56a/react-native-pickers 的常见问题

@elik56a/react-native-pickers 是什么?

Fully customizable React Native pickers with zero native code: wheel, time, duration, date (calendar, range, wheel), month, week strip, expandable calendar, agenda and timeline (day and week view of events), date-time, select (with server search), country

如何安装 @elik56a/react-native-pickers?

在项目目录运行 npm install @elik56a/react-native-pickers,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(>=18)、react-native(>=0.72)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@elik56a/react-native-pickers 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@elik56a/react-native-pickers 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@elik56a/react-native-pickers 可以商用吗?

@elik56a/react-native-pickers 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@elik56a/react-native-pickers 的下载量有多少?

根据 npm 官方下载统计,@elik56a/react-native-pickers 在 2026/10/14 – 2026/11/12 这 30 天内被下载 8,153 次,日均约 272 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@elik56a/react-native-pickers 还在维护吗?

最新版本 1.0.0 发布于 2026/11/09(4 天前);至今共发布 41 个版本,其中过去 12 个月发布了 41 个;首次发布于 2026/10/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。