Получение значений с помощью переключателей в форме reach-hook

#javascript #reactjs #next.js #react-hook-form

#язык JavaScript #реагирует на #next.js #реакция-крючок-форма

Вопрос:

Я учусь программировать в React и Next.js и когда дело доходит до отправки данных в формах, с помощью react-hook-форм действительно легко, но когда дело доходит до переключателей, я немного борюсь. У меня в приложении есть шаг, на котором мне нужно выбрать один вариант из 3, и для этого я использую переключатели.

Код, который я использую здесь, возвращает метод оплаты: PayPal, независимо от того, какой вариант я выбираю из всех переключателей, я всегда его получаю.

 /** @format */  import React, { useContext, useEffect, useState } from 'react'; import { useRouter } from 'next/router'; import Cookies from 'js-cookie'; import { Store } from '../utils/Store'; import Layout from '../components/Layout'; import Main from '../components/ui/Main/Main'; import HeadlineThree from '../components/ui/Type/HeadlineThree/HeadlineThree'; import { Controller, useForm } from 'react-hook-form'; import Section from '../components/ui/Section/Section'; import Button from '../components/ui/Button/Button';  export default function Payment() {  // iniciamos el formulario  const {  handleSubmit,  control,  setValue,  getValues,  formState: { errors },  } = useForm();   // levantamos el router para redirigir  const router = useRouter();   // useState de paymentMethods  const [paymentMethod, setPaymentMethod] = useState('');   // alcanzamos el Store  const { state, dispatch } = useContext(Store);   // pediremos los states  const {  cart: { shippingAddress },  } = state;   // comprobaremos si tiene address y si la tiene, el método de pago  useEffect(() =gt; {  if (!shippingAddress.address) {  router.push('/shipping');  } else {  setPaymentMethod(Cookies.get('paymentMethod') || '');  }  }, []);  // handler del formulario  const submitHandler = data =gt; {  console.log(data);  if (!paymentMethod) {  console.log(data);  } else {  console.log('ahora no');  // dispatch({ type: 'SAVE_PAYMENT_METHOD', payload: paymentMethod });  // Cookies.set('paymentMethod', paymentMethod);  // router.push('/placeorder');  }  };   return (  lt;Layout title='Payment Method'gt;  lt;Main css='padding--32'gt;  lt;form  onSubmit={handleSubmit(submitHandler)}  className='display--grid gap--8'  gt;  lt;HeadlineThreegt;Payment Methodslt;/HeadlineThreegt;  lt;Controller  name='paymentMethod'  control={control}  defaultValue='PayPal'  render={({ field }) =gt; (  lt;labelgt;  lt;input name='paymentMethod' type='radio' {...field} /gt;  lt;spangt;PayPallt;/spangt;  lt;/labelgt;  )}  gt;lt;/Controllergt;  lt;Controller  name='paymentMethod'  control={control}  defaultValue='Stripeaaa'  render={({ field }) =gt; (  lt;labelgt;  lt;input  defaultChecked='true'  name='paymentMethod'  type='radio'  {...field}  /gt;  lt;spangt;Stripelt;/spangt;  lt;/labelgt;  )}  gt;lt;/Controllergt;  lt;Controller  name='paymentMethod'  control={control}  defaultValue='Cash'  render={({ field }) =gt; (  lt;labelgt;  lt;input  name='paymentMethod'  type='radio'  value='Cash'  {...field}  /gt;  lt;spangt;Cashlt;/spangt;  lt;/labelgt;  )}  gt;lt;/Controllergt;  lt;Sectiongt;  lt;Button type='submit' kind='action'gt;  Continue  lt;/Buttongt;{' '}  lt;Button onClick={() =gt; router.push('/shipping')}gt;Backlt;/Buttongt;  lt;/Sectiongt;  lt;/formgt;  lt;/Maingt;  lt;/Layoutgt;  ); }   

Когда я выполняю это, я получаю только: Объект {Метод оплаты: «PayPal»}, и я подозреваю, что это потому, что он первый в группе. Может быть, мне чего-то не хватает, чтобы получить выбранное значение, а не первое в группе.

Ответ №1:

Вам просто нужно сделать следующее, чтобы зарегистрировать радио входного типа. Контроллер в вашем случае не нужен:

 const Component = () =gt; {  const { register, handleSubmit } = useForm();   return (  lt;form onSubmit={handleSubmit(data =gt; console.log(data))}gt;  lt;input type="radio" {...register('paymentMethod')} value="PayPal" /gt;  lt;input type="radio" {...register('paymentMethod')} value="Stripeaaa" /gt;  lt;input type="radio" {...register('paymentMethod')} value="Cash" /gt;   lt;buttongt;Submitlt;/buttongt;  lt;/formgt;  ); }