当前位置: 首页 > 知识库问答 >
问题:

在Formik中使用Material UI的自动完成组件

施飞鸿
2023-03-14

目前正在尝试将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);


共有3个答案

葛成济
2023-03-14

您必须添加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。

裴兴言
2023-03-14

@vencovsky提供了正确的答案,该答案仍然适用于我的材料UI 14.10。1.

在使用Yupvalidation时,我将字段设置为required,因此我添加了更多内容。

要使其正常工作,我有以下几点:Yupconfig:

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,运行FormikonBlur并将字段标记为已触摸。如果随后未拾取某个项目,则Formik将标记该字段,并显示需要联系的验证消息。

陈斌蔚
2023-03-14

你的问题是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知之甚少,所以我不知道是什么原因导致了问题。有人可