无法获得 Material UI 单选按钮以使用 Formik
Cannot get Material UI radio buttons to work with Formik
我正在尝试将 Material UI 单选按钮与 Formik 一起使用,但它们点击不正确。我已将问题简化为以下示例:https://codesandbox.io/s/amazing-currying-s5vn0
如果有人知道我可能做错了什么,或者如果任一系统中存在错误,请告诉我。单击上面示例中的按钮时,它们不会保持单击状态。我有一个更复杂的反应功能组件,它使用其他库组件,所以我不能在这里包含它。它的行为有点不同:即使点击了不同的按钮,按钮仍然被点击。这可能是也可能不是同一个问题。提前致谢。
您需要在要呈现为 Formik 字段的 FormikRadioGroup
组件内呈现单选按钮。这样一来,您实际上可以将 Formik 管理的道具传递给要使用的组件,并允许 RadioGroup
组件确保一次只单击一个按钮。我添加了一个 options
道具来提供一种传递单选选项数组的方法,并删除了您在该组件之外渲染的所有元素:
const FormikRadioGroup = ({
field,
form: { touched, errors },
name,
options,
...props
}) => {
return (
<React.Fragment>
<RadioGroup {...field} {...props} name={name}>
{options.map(option => (
<FormControlLabel value={option} control={<Radio />} label={option} />
))}
</RadioGroup>
{touched[fieldName] && errors[fieldName] && (
<React.Fragment>{errors[fieldName]}</React.Fragment>
)}
</React.Fragment>
);
};
分叉here.
编辑: 使用一个替代示例更新了沙箱,该示例使用渲染函数作为 Field 组件中的子项。
import { FormControlLabel, Radio, LinearProgress } from '@material-ui/core';
import { Formik, Field } from 'formik';
import { RadioGroup } from 'formik-material-ui';
<Formik {...otherProps}>
{({ isSubmitting }) => (
<Field component={RadioGroup} name="activity">
<FormControlLabel
value="painting"
control={<Radio disabled={isSubmitting} />}
label="Painting"
disabled={isSubmitting}
/>
<FormControlLabel
value="drawing"
control={<Radio disabled={isSubmitting} />}
label="Drawing"
disabled={isSubmitting}
/>
<FormControlLabel
value="none"
control={<Radio disabled={isSubmitting} />}
label="None"
disabled
/>
</Field>
)}
</Formik>;
现在这已经记录在案了!使用 formik-material-ui
.
中的 RadioGroup
https://stackworx.github.io/formik-material-ui/docs/api/material-ui/
我正在尝试将 Material UI 单选按钮与 Formik 一起使用,但它们点击不正确。我已将问题简化为以下示例:https://codesandbox.io/s/amazing-currying-s5vn0
如果有人知道我可能做错了什么,或者如果任一系统中存在错误,请告诉我。单击上面示例中的按钮时,它们不会保持单击状态。我有一个更复杂的反应功能组件,它使用其他库组件,所以我不能在这里包含它。它的行为有点不同:即使点击了不同的按钮,按钮仍然被点击。这可能是也可能不是同一个问题。提前致谢。
您需要在要呈现为 Formik 字段的 FormikRadioGroup
组件内呈现单选按钮。这样一来,您实际上可以将 Formik 管理的道具传递给要使用的组件,并允许 RadioGroup
组件确保一次只单击一个按钮。我添加了一个 options
道具来提供一种传递单选选项数组的方法,并删除了您在该组件之外渲染的所有元素:
const FormikRadioGroup = ({
field,
form: { touched, errors },
name,
options,
...props
}) => {
return (
<React.Fragment>
<RadioGroup {...field} {...props} name={name}>
{options.map(option => (
<FormControlLabel value={option} control={<Radio />} label={option} />
))}
</RadioGroup>
{touched[fieldName] && errors[fieldName] && (
<React.Fragment>{errors[fieldName]}</React.Fragment>
)}
</React.Fragment>
);
};
分叉here.
编辑: 使用一个替代示例更新了沙箱,该示例使用渲染函数作为 Field 组件中的子项。
import { FormControlLabel, Radio, LinearProgress } from '@material-ui/core';
import { Formik, Field } from 'formik';
import { RadioGroup } from 'formik-material-ui';
<Formik {...otherProps}>
{({ isSubmitting }) => (
<Field component={RadioGroup} name="activity">
<FormControlLabel
value="painting"
control={<Radio disabled={isSubmitting} />}
label="Painting"
disabled={isSubmitting}
/>
<FormControlLabel
value="drawing"
control={<Radio disabled={isSubmitting} />}
label="Drawing"
disabled={isSubmitting}
/>
<FormControlLabel
value="none"
control={<Radio disabled={isSubmitting} />}
label="None"
disabled
/>
</Field>
)}
</Formik>;
现在这已经记录在案了!使用 formik-material-ui
.
RadioGroup
https://stackworx.github.io/formik-material-ui/docs/api/material-ui/