When you need to coordinate multiple pickers (e.g., a range selector or a complex form), use the Picker Control API. This allows you to manage the state of several pickers through a single controller.
Workflow:
- Wrap your
WheelPicker with withPickerControl to create a ControlPicker component. - Initialize a controller using
usePickerControl<T>(), where T is a map of your picker names to their respective item types. - Use
useOnPickerValueChangedEffect to react to changes across the controlled pickers. - Use
useOnPickerValueChangingEffect to intercept or react to values while they are in the process of changing. - Pass the
control and a unique pickerName to each ControlPicker instance.
import React, {useState} from 'react';
import WheelPicker, {
type PickerItem,
useOnPickerValueChangedEffect,
useOnPickerValueChangingEffect,
usePickerControl,
withPickerControl,
} from '@quidone/react-native-wheel-picker';
import {View} from 'react-native';
const ControlPicker = withPickerControl(WheelPicker);
type ControlPickersMap = {
value1: {item: PickerItem<number>};
value2: {item: PickerItem<number>};
};
const data = Array.from({length: 100}, (_, index) => ({value: index}));
const App = () => {
const [value, setValue] = useState({value1: 0, value2: 0});
const pickerControl = usePickerControl<ControlPickersMap>();
useOnPickerValueChangedEffect(pickerControl, (event) => {
setValue({
value1: event.pickers.value1.item.value,
value2: event.pickers.value2.item.value,
});
});
useOnPickerValueChangingEffect(pickerControl, (event) => {
// some logic
});
return (
<View style={{flexDirection: 'row', justifyContent: 'space-around'}}>
<ControlPicker
control={pickerControl}
pickerName={'value1'}
data={data}
value={value.value1}
width={100}
enableScrollByTapOnItem={true}
/>
<ControlPicker
control={pickerControl}
pickerName={'value2'}
data={data}
value={value.value2}
width={100}
enableScrollByTapOnItem={true}
/>
</View>
);
};