Skip to content

Instantly share code, notes, and snippets.

@pjchender
Created February 24, 2020 03:01
Show Gist options
  • Save pjchender/69f310e62e215e45dd32868400681971 to your computer and use it in GitHub Desktop.
Save pjchender/69f310e62e215e45dd32868400681971 to your computer and use it in GitHub Desktop.
React Formik with RadioGroup
import React from 'react';
import { Formik, Form, useField } from 'formik';
const GENDERS = [
{
name: 'other',
value: 0,
},
{
name: 'male',
value: 1,
},
{
name: 'female',
value: 2,
},
];
const InputRadio = ({ label, ...props }) => {
const [field, meta] = useField(props);
// NOTICE:
// 不將 <input /> 中的 value 轉成 String 時
// 在 field 中的 value 會是 Number,但在 meta 中的 value 會是字串
return (
<>
<div>
<input type="radio" {...field} {...props} />
<label htmlFor={props.id || props.name}>{label}</label>
</div>
</>
);
};
const RadioButtonForm = () => {
return (
<>
<Formik
initialValues={{
gender: '',
}}
>
{() => (
<Form>
{GENDERS.map(({ name, value }) => {
return (
<InputRadio
label={value}
id={value}
type="radio"
name="gender"
// ⚠️ 把 value toString 才能正確運作
value={value.toString()}
key={value}
/>
);
})}
</Form>
)}
</Formik>
</>
);
};
export default RadioButtonForm;
@pjchender
Copy link
Author

不將 <input /> 中的 value 轉成 String 時,在 field.value 會是 Number,但 meta.value 會是字串,這會導致 Formik 匹配錯誤,而沒辦法讓該 input 被勾選(checked),因此需要把傳入的 value 先轉成字串後就會正常。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment