reactjs - 将 Material-UI 的 Autocomplete 组件与 Formik 一起使用
问题描述
目前正在尝试将 Material UI 的Autocomplete组件与 Formik 一起使用。到目前为止,诸如文本字段和 Material-UI 中的传统选择之类的东西在 Formik 中表现得非常好。实现自动完成并非如此。Formik 的 onChange 处理程序似乎没有更新 my 的值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);
解决方案
你的问题是这handleChange
不会像你正在做的那样工作。
如果您查看handleChange 文档:
通用输入更改事件处理程序。这将更新 values[key] ,其中 key 是事件发射输入的名称属性。如果 name 属性不存在,handleChange 将查找输入的 id 属性。注意:这里的“输入”是指所有 HTML 输入。
这应该可以正常工作,但问题是TextField
内部Autocomplete
只会handleChange
在您在其上键入内容时触发,并且值将是文本,而不是id
您想要的或其他属性,因此您需要移动handleChange
到Autocomplete
.
还有另一个问题,您不能在 中使用handleChange
,Autocomplete
因为它没有引用您想要的输入,并且它还具有与 的正常参数不同的参数onChange
,input
正如您在docs中看到的那样。
onChange
func
值更改时触发回调。
签名::
function(event: object, value: any) => void
event
回调的事件源
value
:null
所以你需要做的是使用setFieldValue
并将它传递给Autocomplete
like
onChange={(e, value) => setFieldValue("city_id", value)}
您需要传递字段的名称以及要获取的值。
这是一个工作示例
推荐阅读
- java - 如何在 android 中实现 twitter 深层链接?
- java - 使用 JDTLS(Java 语言服务器)的 Neovim 夜间构建无法识别 ${CLASSPATH} 中的 JAR 文件
- scrapy - 为什么使用代理旋转器时scrapy这么慢?
- python - 如果在数据库中丢失,Python 检查和更新递归文件路径的最快方法
- python - django 表单验证错误未显示在 DetailView 中
- scapy - 为什么一个 IP 对象有多个 IP 地址?
- azure-data-factory - Azure 数据资源管理器命令动态参数错误
- json - 用权重值标记弧形图弧
- vue.js - 没有版本代码的 Vue CLI 服务生产构建?
- angular - 检索 Angular FormGroup 中每个字段的值