Car*_*rds 15 reactjs material-ui formik
目前正在尝试在Formik 中使用 Material UI 的自动完成组件。到目前为止,诸如文本字段和 Material-UI 中的传统选择之类的东西在 Formik 中表现得非常好。实现自动完成并非如此。Formik 的 onChange 处理程序似乎没有更新我的city_id. 我知道 Autocomplete 仍然不是 Material-UI 的核心库的一部分,但目前仍在观察是否有可能发生这样的事情。
import React from "react";
import ReactDOM from "react-dom";
import { Formik, Form } from 'formik';
import TextField from '@material-ui/core/TextField';
import Autocomplete from '@material-ui/lab/Autocomplete';
import Button from '@material-ui/core/Button';
import { cities } from '../data/cities';
import "./styles.css";
const initialValues = {
city_id: '',
};
const submit = params => {
alert(`Value for city_id is: ${params.city_id}`);
};
function App() {
return (
<Formik
initialValues={ initialValues }
onSubmit={ submit }
>
{({
handleChange,
values,
}) => (
<Form>
<Autocomplete
id="city_id"
name="city_id"
options={ cities }
groupBy={ option => option.state }
getOptionLabel={ option => option.name }
style={{ width: 300 }}
renderInput={params => (
<TextField
{ ...params }
onChange={ handleChange }
margin="normal"
label="Cities"
fullWidth
value={ values.city_id }
/>
)}
/>
<Button
variant="contained"
color="primary"
type="submit"
>
Submit
</Button>
</Form>
)}
</Formik>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Run Code Online (Sandbox Code Playgroud)
Ven*_*sky 25
你的问题是这handleChange不会按照你的方式工作。
如果您查看handleChange 文档:
通用输入更改事件处理程序。这将更新 values[key],其中 key 是事件发射输入的 name 属性。如果 name 属性不存在,handleChange 将查找输入的 id 属性。注意:这里的“输入”是指所有 HTML 输入。
这应该工作正常,但问题是,TextField里面Autocomplete只会触发handleChange当你输入了东西,和值将是文本,而不是id你想要或其他财产,所以你需要移动handleChange到Autocomplete。
还有另一个问题,你不能使用handleChangein ,Autocomplete因为它没有引用你想要的输入,而且它也有与 正常onChange的不同的参数input,正如你在文档中看到的那样。
onChange
func
值更改时触发的回调。
签名::
function(event: object, value: any) => void
event回调的事件源
value:空
所以你需要做的是使用setFieldValue并传递给Autocomplete喜欢
onChange={(e, value) => setFieldValue("city_id", value)}
Run Code Online (Sandbox Code Playgroud)
您需要传递您的字段名称以及您想要获取的值。
这是一个工作示例
小智 5
@vencovsky 提供了正确的答案,该答案仍然适用于 Material UI 14.10.1。
我在其中添加了更多内容,因为我已将我的字段设置为required使用Yup验证。
为了让它正常工作,我有以下内容:
Yup配置:
validationSchema = {
Yup.object().shape({
contact: Yup.string().max(255).required('Contact is required'),
})
}
Run Code Online (Sandbox Code Playgroud)
反应:
<Autocomplete
id="contact-autocomplete"
options={contacts}
getOptionLabel={(contact) => `${contact?.firstName} ${contact?.lastName}`}
onChange={(e, value) => setFieldValue("contact", value?.id || "")}
onOpen={handleBlur}
includeInputInList
renderInput={(params) => (
<TextField
{...params}
error={Boolean(touched.contact && errors.contact)}
fullWidth
helperText={touched.contact && errors.contact}
label="Contact Person"
name="contact"
variant="outlined"
/>
)}
/>
Run Code Online (Sandbox Code Playgroud)
当用户单击该Autocomplete元素时,它会触发onOpen运行Formik onBlur并将该字段标记为已触摸的 。如果然后未选择项目,则flags在该字段中形成并显示Contact is required验证消息。
| 归档时间: |
|
| 查看次数: |
9293 次 |
| 最近记录: |