【问题标题】:Material UI unable to set default value on AutocompleteMaterial UI 无法在自动完成上设置默认值
【发布时间】:2021-09-29 09:07:50
【问题描述】:

我正在使用 React Hook Form 在从 API 加载数据时设置 gender 自动完成的值。但是自动完成似乎没有设置数据。 我的主要组件如下所示:

// this function is used to set the default form values. for now, its just gender value
const setFormValues = () => {
       setValue("gender", {id: 'male', name: 'Male'})
    };

在 useEffect 中,每当数据加载完成时,我都会运行上述函数。

// prerequisites consists of many objects. gender is one of them
useEffect(() => {
        setFormValues();
    }, [prerequisites]);

组件如下所示:

<Controller
        name={name}
        control={control}
        render={({field: {onChange}}) => (
          <Autocomplete
            onChange={(e, data) => onChange(data?.[onChangeAttribute])}
            options={options || []}
            getOptionLabel={(option) => option.name}
            isOptionEqualToValue={(option, value) => option.id === value.id}
            renderInput={(params) => <TextField {...params} placeholder="test" label="test"/>}
          />
        )}
      />

然后我继续阅读将我指向this 的文档。基本上,我可以传递一个默认值。然后我继续创建一个状态并从setFormValues() 函数设置该状态。状态设置正确。但是当我将它传递给defaultValue 时,该值没有被设置,而是向我显示错误不受控制的组件被用作受控组件并将其用作受控组件。

我想做的事:

我的想法是设置默认值,该值来自对 useEffect 的 API 调用。基本上,该页面是“编辑”页面,我想显示当前选择。

【问题讨论】:

    标签: reactjs autocomplete material-ui react-hook-form


    【解决方案1】:

    您没有在 &lt;Autocomplete /&gt; 上设置 value 属性。

    <Controller
      name={name}
      control={control}
      render={({field: {onChange, value}}) => (
        <Autocomplete
          onChange={(e, data) => onChange(data?.[onChangeAttribute])}
          options={options || []}
          value={value}
          getOptionLabel={(option) => option.name}
          isOptionEqualToValue={(option, value) => option.id === value.id}
          renderInput={(params) => <TextField {...params} placeholder="test" label="test"/>
          }
        />      
      )}
    />
    

    当您的 API 调用应该返回其他表单值时,您也可以只使用 RHF 的 reset

    useEffect(() => {
      reset(prerequisites);
    }, [prerequisites]);
    

    【讨论】:

    • 所以如果值为空,则返回The 'getOptionLabel' method of Autocomplete returned undefined instead of a string for "".
    • 如果value 为空,则应该是null 值,以便&lt;Autocomplete /&gt; 组件可以检查没有提供任何值。否则它会认为"" 是实际值,然后当然不能将它链接到您的任何options。查看这个工作示例,了解如何将&lt;Autocomplete /&gt; 与 RHF 一起使用 -> CodeSandbox
    • 我已经改变了一切,它完美无瑕。我只有一个问题,即使在官方文档中也找不到答案。如果我不想得到一个对象作为回报,而只是使用 ID 怎么办?所以我将对象传递给选项。然后我使用getOptionLabel 设置标签属性(在我的例子中是名称)。 value 返回一个对象,onChange 也应该是一个对象。如果我只想在更改时设置 id 属性但仍使标签和其他内容正常工作怎么办?编辑:意识到这没有意义。感谢您的帮助!
    • 没有您的评论确实有意义,但我会在提交处理程序上进行该操作,并继续为您的实际组件处理对象。
    【解决方案2】:

    不要设置默认值,而是尝试使用您想要的默认值设置一个状态,然后设置value={thestate},以便onChange 应该更改相同的状态。

    【讨论】:

    • 是的,但它不会在反应钩子形式之外吗?我不想将其设置为单独的状态,并让所有其他输入由钩子形式控制。
    • 这是最简单的方法,但你是对的,在这种情况下,之前的答案是最好的。
    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 2022-01-09
    • 2021-11-12
    • 2021-04-05
    • 2020-12-08
    • 2018-04-27
    • 2020-04-16
    • 2017-07-24
    相关资源
    最近更新 更多