Haptics
Native wheels tick under your finger. Get the same feel with onValueChanging, which fires on every row crossing while scrolling, and on every step while dragging a slider. The library has no haptics dependency, so bring the one you already use.
expo-haptics​
npx expo install expo-haptics
import * as Haptics from 'expo-haptics';
import { WheelPicker, TimePicker, DatePicker } from '@elik56a/react-native-pickers';
const tick = () => Haptics.selectionAsync();
<WheelPicker items={items} value={v} onChange={setV} onValueChanging={tick} />
<TimePicker value={t} onChange={setT} onValueChanging={tick} />
<DatePicker display="wheel" value={d} onChange={setD} onValueChanging={tick} />
react-native-haptic-feedback​
import ReactNativeHapticFeedback from 'react-native-haptic-feedback';
const tick = () => ReactNativeHapticFeedback.trigger('selection', { enableVibrateFallback: false });
<WheelPicker onValueChanging={tick} … />
Confirm haptics​
For a stronger buzz when a value is confirmed, use onChange or a sheet's onConfirm:
<DatePickerSheet
…
onConfirm={(range) => {
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
setRange(range);
}}
/>
Which components support onValueChanging​
| Component | Callback argument |
|---|---|
WheelPicker | (value, index) |
MultiWheelPicker columns | (value, index) per column |
TimePicker / TimePickerSheet | (date) |
DateWheelPicker / DatePicker display="wheel" | (date) |
DateTimePicker display="wheel" / DateTimePickerSheet | (date) |
DurationPicker / DurationPickerSheet | (seconds) |
WheelPickerSheet | (value, index) |
Slider | (value), or [start, end] when range is set |
In the time, date and duration pickers it fires from the wheels only: a dial, number boxes or clickable columns don't call it. Disabled rows don't trigger it either.