Search code examples
reactjsformsradio-buttonreact-hook-form

Radio buttons with react-hook-form


I created a form with react-hook-form. It logs "fullName" and "city" correctly in the console, but not the radio buttons. With the radio buttons you get as result "null".

My code is as follows.

import React from 'react'
import './App.css';
import {useForm} from "react-hook-form";

function App() {
    const {register, handleSubmit} = useForm();

    function onSubmitButton(data) {
        console.log(data)
    }

    return (
        <>
            <h1>Order weather</h1>
            <form onSubmit={handleSubmit(onSubmitButton)}>
                <input
                    {...register("fullName")}
                    type="text"
                    name="fullName"
                    placeholder="Name and surname"
                    id="name"
                />
                <input
                    {...register("city")}
                    type="text"
                    name="city"
                    placeholder="City"
                    id="city"
                />
                <p>I would like to:</p>
                <label htmlFor="field-rain">
                    <input
                        {...register("rain")}
                        type="radio"
                        name="weather"
                        value="rain"
                        id="field-rain"
                    />
                    Rain
                </label>
                <label htmlFor="field-wind">
                    <input
                        {...register("wind")}
                        type="radio"
                        name="weather"
                        value="wind"
                        id="field-wind"
                    />
                    Lots of wind
                </label>
                <label htmlFor="field-sun">
                    <input
                        {...register("sun")}
                        type="radio"
                        name="weather"
                        value="sun"
                        id="field-sun"
                    />
                    Sunny
                </label>
                <button type="submit">
                    Send
                </button>
            </form>
        </>
    );
}

export default App;

When I turn off name= "weather" and I check the buttons it does put it in the console, but it is not supposed to allow me to check all the buttons at the same time. Anyone have an idea how I can make sure I can get what is checked into the console?


Solution

  • Since rain, wind, sun should be assign to the same value we need to pass same params to register function as below

    function App() {
        const {register, handleSubmit} = useForm();
    
        function onSubmitButton(data) {
            console.log(data)
        }
    
        return (
            <>
                <h1>Order weather</h1>
                <form onSubmit={handleSubmit(onSubmitButton)}>
                    <input
                        {...register("fullName")}
                        type="text"
                        placeholder="Name and surname"
                        id="name"
                    />
                    <input
                        {...register("city")}
                        type="text"
                        placeholder="City"
                        id="city"
                    />
                    <p>I would like to:</p>
                    <label htmlFor="field-rain">
                        <input
                            {...register("weather")}
                            type="radio"
                            value="rain"
                            id="field-rain"
                        />
                        Rain
                    </label>
                    <label htmlFor="field-wind">
                        <input
                            {...register("weather")}
                            type="radio"
                            value="wind"
                            id="field-wind"
                        />
                        Lots of wind
                    </label>
                    <label htmlFor="field-sun">
                        <input
                            {...register("weather")}
                            type="radio"
                            value="sun"
                            id="field-sun"
                        />
                        Sunny
                    </label>
                    <button type="submit">
                        Send
                    </button>
                </form>
            </>
        );
    }
    
    export default App;
    

    I hope this will fix the issue.