目前正在尝试将Material UI的自动完成组件与Formik一起使用。到目前为止,文本字段和从材质UI中选择的传统内容都可以很好地使用Formik。实现自动完成并非如此。Formik的onChange处理程序似乎没有更新mycity\u id的值。我知道Autocomplete仍然不是MaterialUI的核心库的一部分,但目前仍在考虑这样的可能性。
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);
您必须添加onChange={(事件,值)=
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 [cityId,setCityId]=React.useState({city_id:''});
const handleChange=(value)=>{
// Here is the value is a selected option label or the new typed value
setCityId({city_id:value});
}
function App() {
return (
<Formik
initialValues={ cityId }
onSubmit={() => {
alert(`Value for city_id is: ${cityId.city_id}`);
}}
>
{({
handleChange,
values,
}) => (
<Form>
<Autocomplete
id="city_id"
name="city_id"
options={ cities }
groupBy={ option => option.state }
getOptionLabel={ option => option.name }
style={{ width: 300 }}
onChange = {(event, value) => handleChange(value)}
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);
如果onChange不起作用,您也可以使用onInputChange。
@vencovsky提供了正确的答案,该答案仍然适用于我的材料UI 14.10。1.
在使用Yup
validation时,我将字段设置为required
,因此我添加了更多内容。
要使其正常工作,我有以下几点:Yup
config:
validationSchema = {
Yup.object().shape({
contact: Yup.string().max(255).required('Contact is required'),
})
}
反应:
<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"
/>
)}
/>
当用户单击Autocomplete
元素时,它会启动onOpen
,运行Formik
onBlur
并将字段标记为已触摸。如果随后未拾取某个项目,则Formik将标记该字段,并显示需要联系的验证消息。
你的问题是handleChange
不会像你现在这样工作。
如果你看看句柄更改文档:
通用输入更改事件处理程序。这将更新值[key],其中key是发出事件的输入的name属性。如果name属性不存在,handleChange将查找输入的id属性。注意:“输入”在这里是指所有HTML输入。
这应该可以正常工作,但问题是Autocomplete
中的TextField
只会在您键入内容时触发handleChange
,值将是文本,而不是id
或您想要的其他属性,因此您需要将handleChange
移动到Autocomplete
。
还有另一个问题,您不能在自动完成
中使用handleChange
,因为它没有引用您想要的输入,而且它的参数也与输入
的正常onChange
不同,正如您在文档中看到的那样。
onChange
func
值更改时触发回调。
因此,您需要做的是使用setFieldValue并将其传递给自动完成
onChange={(e, value) => setFieldValue("city_id", value)}
您需要传递字段的名称以及希望获得的值。
这里有一个工作例子
问题内容: 在jQuery UI 1.8.4之前,我可以在为使用自动完成功能而构建的JSON数组中使用HTML。 我能够做类似的事情: 那会在下拉菜单中显示为红色文本。 从1.8.4开始,这不起作用。我找到了,该页面告诉我在这里使用自定义HTML示例,但我并不幸运。 如何使HTML显示在建议中? 我的jQuery是: 我的JSON数组包含HTML,如下所示: 问题答案: 将此添加到您的代码: 因此
问题内容: 也许您可以解决一些Ajax问题。 我有AUTO COMPLETE代码-我输入城市名称,该代码会自动为我完成城市名称,还获取城市ID,并应将其放入隐藏的输入字段中(名称=“ cityID”)…但它没有做到这一点。 你能告诉我为什么吗? html代码: 服务器端(仅输出): 脚本: 您可以在这里找到完整的JS: 问题答案: 尝试对ajax_response_city使用div而不是span
我已经使用Spring Data Solr索引了一个位置数据库。我有以下字段: 我试图实现一个自动完成功能。我的ajax调用由一个控制器处理,该控制器调用一个存储库: 这适用于像“加利福尼亚”或“洛杉矶”这样的搜索。但是当我尝试像“洛杉矶”这样的多个单词时,我会得到一个例外: 严重:Servlet。路径为[/xxx]的上下文中servlet[spring mvc]的服务()引发异常[请求处理失败;
问题内容: 我正在寻找一种将自动完成功能添加到JavaFX的方法ComboBox。经过大量搜索之后,该在这里提问了。 这AutoFillBox是已知的,但不是我要搜索的内容。我想要的是一个可编辑的组合框,在键入列表时应进行过滤。但是我也想打开列表而不输入并查看整个项目。 任何想法? 问题答案: 我找到了一个对我有用的解决方案: 你可以用 基于此,我根据自己的需要对其进行了自定义。 随时使用它,如果
我正在寻找一种将自动完成添加到JavaFX的方法。 这个是已知的,但不是我正在搜索的。我想要的是一个可编辑的组合框,在输入时,列表应该被过滤掉。但我也想打开列表,而不必输入和查看所有项目。 知道吗?
Eclipse不支持javaScript自动完成和代码高亮,不想使用像codemix这样的付费插件,tabIX有没有其他选择,而不使用其他Ide像Vscode ??
问题内容: 好吧,我一直在为此绞尽脑汁(这太糟糕了),但是我一直尝试阅读我所能而且仍然无法使它起作用的内容。 试图用jQuery UI做自动完成 我的json看起来像这样 我正在尝试将此信息用作自动完成的来源。我得到的响应对象很好,我很难以正确的格式获得它,因此我可以将“ ”放在与“值”相关联的隐藏字段中,该字段需要显示为“值”的一部分落下。 尝试了一百万种不同的方法,但最近的尝试却在下面 请多谢
问题内容: 无法使jQuery自动完成小部件与Flask框架一起使用。(http://jqueryui.com/autocomplete/#remote这里是一个示例) 在manage.py中,我得到了以下内容: 我的index.html文件: 似乎firefox中的开发工具不会返回任何错误。终端返回以下内容: 小部件不起作用。由于我对jQuery知之甚少,所以我不知道是什么原因导致了问题。有人可