I was using React Hook Form in my new React Native project. Unfortunately I was not able to find any useful examples of React Hook Form’ dropdown implementation in React Native except this one. So I had to put some time figuring this out for myself.
My requirement was quite simple. I have had a small form to build including some dropdown selection lists. The very first thing I had to decide was to find a good and stable dropdown/selection package for react native. My search ended at these two packages:
Since I was building my React Native app on the top of Expo framework, the @react-native-picker/picker was the default recommended package in Expo documentation. I decided to use it.
I installed it and then went to use it. However, I had to be disappointed since the interface UI was not good enough. The dropdown looked scattered on the page, horizontally, like this:

It was taking too much of space around the selection element. I could not find a quick work around to control this behavior so I turned back to the first one i.e. react-native-picker-select.
To my surprise, the react-native-picker-select was built on the top of react-native-picker/picker so I was kind of Ok to use both to make my dropdown working eventually.
Here is the complete code
Include the packages:
import RNPickerSelect from 'react-native-picker-select';
import { useForm, Controller } from "react-hook-form";Initialise the React Hook Form inside main component function:
const { control, handleSubmit, formState: { errors } } = useForm({
defaultValues: {
sport: '',
}
});Create a onSubmit function:
const onSubmit = (data:object) => {
console.log(data)
}Render the dropdown within React Hook Form’s <Controller />
<Controller
control={control}
rules={{
required: true,
}}
render={({ field: { onChange, onBlur, value } }) => (
<RNPickerSelect
onValueChange={
(value) => {
console.log(value)
onChange(value)
}
}
items={[
{ label: 'Football', value: 'football' },
{ label: 'Baseball', value: 'baseball' },
{ label: 'Hockey', value: 'hockey' },
]}
onClose={(value) => {
console.log("I am closed")
}}
/>
)}
name="sport"
/>
{errors.sport && <Text className="text-red-500 mt-0.5 pl-0.5">This is required.</Text>}Calling onChange(value) within onValueChange does the trick for ReactHookForm:
onValueChange={
(value) => {
console.log(value)
onChange(value)
}
}Clicking Submit button would print the value in console.log
LOG {"sport": "football"}
One thought on “Implementing Dropdown Selection with React Hook Form in React Native”