javascript - Material UI RadioGroup ile react-hook-form kullanıldığında seçili değer her zaman NULL oluyor
React-hook-form Controller ile sarılmış Material UI'dan RadioGroup kullanmaya çalışıyorum, her zaman seçilen değeri null alıyorum, işte kodum, neyi kaçırdığımı merak ediyorum?
import * as React from "react";
import {
FormControl,
FormControlLabel,
FormHelperText,
Radio,
RadioGroup
} from "@mui/material";
import { useState } from "react";
import { useFormContext, Controller } from "react-hook-form";
interface IOptionTypes {
id: string;
label: string;
value: string;
desc?: string;
}
interface IFormElementTypes {
name: string;
options: IOptionTypes[];
}
export default function RadioFieldElement({
name,
options
}: IFormElementTypes) {
const {
control,
register,
formState: { errors }
} = useFormContext();
return (
<Controller
name={name}
defaultValue=""
control={control}
render={({ field }) => (
<FormControl fullWidth>
<RadioGroup
{...field}
{...register(name)}
row
onChange={(event, value) => field.onChange(value)}
value={field.value}
>
{options.map((option) => (
<FormControlLabel
key={option.id}
value={option.value}
control={<Radio />}
label={option.label}
/>
))}
</RadioGroup>
<FormHelperText>{String(errors[name]?.message ?? "")}</FormHelperText>
</FormControl>
)}
/>
);
}
İşte canlı kod.
Sadece listeden herhangi bir değeri seçin ve konsolda gönder düğmesine basın, değerin her zaman null olduğunu göreceksiniz.
Yardım için teşekkürler.
Cevap #1
RadioFieldElement.tsx dosyanızda RadioGroup üzerinde {...register(name)} koymanıza gerek yok. Sadece bunu kaldırın ve her şey beklendiği gibi çalışacaktır:
<RadioGroup
{...field}
// remove this line ---> {...register(name)}
row
onChange={(event, value) => field.onChange(value)}
value={field.value}
>
İşte tam bir codesandbox örneği:
Cevap #2
RadioAlanElemanı.tsx
import * as React from "react";
import {
FormControl,
FormControlLabel,
FormHelperText,
Radio,
RadioGroup
} from "@mui/material";
import { useState } from "react";
import { useForm, Controller } from "react-hook-form"; // use useForm
interface IOptionTypes {
id: string;
label: string;
value: string;
desc?: string;
}
interface IFormElementTypes {
name: string;
options: IOptionTypes[];
}
export default function RadioFieldElement({
name,
options
}: IFormElementTypes) {
const {
control,
register,
formState: { errors }
} = useForm();
/* const [theValue, setTheValue] = useState(control._defaultValues[name]);
const handleChange = (event) => {
console.log(event.target.value);
setTheValue(event.target.value);
}; */
return (
<Controller
name={name}
defaultValue=""
control={control}
render={({ field }) => (
<FormControl fullWidth>
<RadioGroup
{...field}
{...register(name)}
row
onChange={(event, value) => field.onChange(value)}
value={field.value}
>
{options.map((option) => (
<FormControlLabel
key={option.id}
value={option.value}
control={<Radio />}
label={option.label}
/>
))}
</RadioGroup>
<FormHelperText>{String(errors[name]?.message ?? "")}</FormHelperText>
</FormControl>
)}
/>
);
}