MUI 的 Autocomplete AS MULTIPLE input + react-hook-form + 控制默认值不起作用(TypeError: Can't read property 'f

Posted

技术标签:

【中文标题】MUI 的 Autocomplete AS MULTIPLE input + react-hook-form + 控制默认值不起作用(TypeError: Can\'t read property \'filter\' of undefined)【英文标题】:MUI's Autocomplete AS MULTIPLE input + react-hook-form + controlling default values not working (TypeError: Can't read property 'filter' of undefined)MUI 的 Autocomplete AS MULTIPLE input + react-hook-form + 控制默认值不起作用(TypeError: Can't read property 'filter' of undefined) 【发布时间】:2020-11-18 19:53:19 【问题描述】:

我正在尝试将Material-UI Autocomplete 用作多个输入,其中react-hook-formcontrol 动态自动完成的defaultValues(根据从数据库获取的已保存数据,在编辑数据时渲染组件预填充) .

所以主要问题是:

控制Material-UI Autocomplete 组件中的默认值并将其与react-hook-form 一起使用的最佳方法是什么?

到目前为止我做了什么:

    在 react 中使用函数和钩子,我已经包装了一个 React Hook Form 的 Controller 中的自动完成组件来控制 国家。我试图从 MUI 的文档中实现解决方案 和react-hook-form 以及以下线程的解决方案。

    I created a minimal Sandbox here

它的作用

当我在Controller 中设置defaultValue 时,它可以显示受控的默认值,但会引发错误:TypeError: Cannot read property 'filter' of undefined

  <Controller
      as=
      <Autocomplete
        multiple
        value=defaultValues
        onChange=(e, values) => setValue("food", values)
        ...
        renderInput=params => ( ... )
      />
    
    control=control
    name="food"
    defaultValue=defaultValues // <- this makes the error
  />

当我没有在Controller 中设置defaultValue 时,它可以完美地选择multiple 的值,但它不显示默认值。

令人困惑的是,Autocomplete 必须用value/onChange 控制,Controller 必须用defaultValue/setValue 控制,在我的情况下它们似乎冲突。

    设置defaultValue= [] 并使用 useEffect 并仅使用控制默认值 setValue("food", defaultOption);

    So i created another Sandbox here

    感谢 Bill 的回答,我将代码重构为 renderProp 就像文档中提出的那样:

    Yet another sandbox here

    现在它就像一个魅力,但我必须设置 onChange 属性 Autocomplete 是这样的:

    onChange=(e, values) =&gt; setValue("food", values)

    而不是文档建议做的事情:(使用传递的 onChange)

    onChange=e =&gt; props.onChange(e.something)

    它有效,但这是将Autocompletereact-hook-form?

将问题与这些主题进行比较:

与我尝试做的其他线程的主要区别是设置defaultValuesmultiple Autocomplete

Proper way to use react-hook-form Controller with Material-UI Autocomplete

MUI Autocomplete's 'defaultValue' not working when used with Controller of react-hook-form

Why is initial value not set in Material UI Autocomplete using react-hook-form?

react-hook-form 文档中的建议解决方案:

https://react-hook-form.com/api/#Controller

还有来自Material UI docs 的代码:

https://material-ui.com/components/autocomplete/#multiple-values

【问题讨论】:

如果您使用的是 V6,请考虑使用 render prop。 【参考方案1】:

现在它就像一个魅力,但我必须设置 onChange 道具 像这样自动完成:

onChange=(e, values) =&gt; setValue("food", values)

你可以onChange=(e, newValue) =&gt; props.onChange(newValue)

【讨论】:

【参考方案2】:

但是,我还没有找到使用 react-hook-form 验证这一点的方法

您可以尝试自定义验证(如果您使用 MUI 的 Autocomplete 和 multiple=true):

<Controller
...
rules=
   validate: (data) => 
     if(data.length === 0) return false;
   

/>

【讨论】:

【参考方案3】:

我能够通过执行以下操作来完成这项工作:

                                <Controller
                                    name='test'
                                    control=control
                                    render=(onChange, ...props) => (
                                        <AutoComplete
                                            ...props
                                            data-testid='test-select'
                                            width=350
                                            label='Auto Complete'
                                            onChange=onChange
                                            options=eventTypes
                                            getOptionLabel=(option) => option ? option.name : ''
                                            renderOption=(option) => option.name 
                                            getOptionSelected=(option) => option.name
                                            renderInput=(params) => (
                                                <TextField ...params error=error helperText=helperText label=label placeholder=label />
                                            )
                                            onChange=(e, data) => onChange(data)
                                            ...props
                                        />
                                    )
                                />

【讨论】:

但是,我还没有找到使用 react-hook-form 验证这一点的方法

以上是关于MUI 的 Autocomplete AS MULTIPLE input + react-hook-form + 控制默认值不起作用(TypeError: Can't read property 'f的主要内容,如果未能解决你的问题,请参考以下文章

解决mui错误:Unable to preventDefault inside passive event listener due to target being treated as passiv

MUI 自动完成自定义选项,不显示所选选项

(React、MaterialUI、Context)MUI 自动完成/TextField 未在挂载时呈现其值

Rails 4 Autocomplete with Simple Form - 类参数被忽略

_mm_mul_epu32 与 _mm_mul_epi32

mul函数的具体用法