reactjs - 使用 Material UI 在嵌套表单中传递 Formik 输入值
问题描述
我目前在将 Formik 与 MaterialUI 表单一起使用时遇到问题。具体来说,我在使用 Material UI 以嵌套形式传递 Formik 输入值时遇到了问题,Formik.handleChange
并且在将值从数字更改为字符串时遇到了一个小问题。
我有多个表单,这些表单在 Material UI 中与 Stepper 组件分开。由于我还在学习,我尝试将 Formik 包裹在其中一个步骤上(稍后我将包裹整个步进器)。这是它的外观:
{activeStep === 0 && (
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
>
{formik => (
<form onSubmit={formik.handleSubmit}>
<div className="col-xl-6">
<Portlet fluidHeight>
<PortletHeader title="Incident Type" />
<PortletBody>
<IncidentSelect formik={formik} />
</PortletBody>
</Portlet>
</div>
</form>
)}
</Formik>
)}
问题出在 IncidentSelect 表单内部,FormikhandleChange
似乎没有更改 selected radioButton
。当我在 Chrome 中使用 React Developer Tools 进行检查时,似乎Formik.handleChange
将值从 0 更改为“0”。我该如何解决?
另外,按照教程,我不确定如何抽象我的组件?请注意, DateTimePicker 正在使用material-ui/pickers。我不确定如何将值传递给 Formik。
任何帮助表示赞赏。
谢谢
function IncidentSelect(props) {
const [value, setValue] = React.useState("female");
const handleRadioChange = e => {
console.log(props.formik.getFieldProps("incidentType"));
setValue(e.target.value);
};
return (
<>
<FormControl component="fieldset">
<FormLabel component="legend" required>
Incident Type:
</FormLabel>
<RadioGroup
aria-label="Incident Type"
name="incidentType"
value={value}
onChange={handleRadioChange}
{...props.formik.getFieldProps("incidentType")}
>
<FormControlLabel
value={0}
control={<Radio />}
label="Injury To Guest"
/>
<FormControlLabel
value={1}
control={<Radio />}
label="Injury To Worker"
/>
<FormControlLabel
value={2}
control={<Radio />}
label="Incident / Accident"
/>
<FormControlLabel
value={3}
disabled
control={<Radio />}
label="OSH / Kids Camp"
/>
</RadioGroup>
</FormControl>
<DateTimePicker
label="Signed Date"
variant="outlined"
className={classes.margin}
value={selectedDate}
onChange={handleDateChange}
/>
</>
);
}
解决方案
如教程中所述,抽象您要使用的组件更容易。让您有机会稍后在您的应用程序中重用它们和更易读的代码。
Formik 为您提供useFields
API 以通过 hooks 获取字段的 props。useFields
正在寻找name
你的组件的 props 来找到对应的字段。
因此RadioGroup
可以从 MaterialUI 中提取如下:
export const IncidentRadioButton = ({ options, ...props }) => {
const [field, meta] = useField(props);
return (
<>
<RadioGroup {...field} {...props}>
{options.map((option, index) => (
<FormControlLabel
control={<Radio />}
label={option.name}
value={option.value}
key={index}
/>
))}
</RadioGroup>
{meta.touched && meta.error ? (
<div className="error">{meta.error}</div>
) : null}
</>
);
};
然后您可以使用options
道具相应地放置您的数据
推荐阅读
- java - 为什么我的代码在 for 循环之后没有执行?
- firebase - 注销时取消订阅 Firestore 侦听器
- javascript - Angular:无法读取未定义的属性“id”
- r - R包分析促销自相残杀?
- azure-devops - 使用所有历史记录、标签和拉取请求将 Azure DevOps Git 存储库从一个组织迁移到另一个组织
- c++ - 非阻塞 Poco HTTP 服务器?
- python - Matplotlib 生成的 pdf 无法被 Acrobat Reader 打开
- r - 霍尔特温特斯预测 R
- r - 栅格的相关性和 p 值
- c++ - 如何在 C++ 中通过 UDP 发送任何文件(图像、exe)?