You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MUI TextField通过inputComponent传自定义组件报错求助

问题描述

尝试通过InputProps->inputComponent将自定义组件传入MUI TextField时,触发以下错误:

Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.

试过使用createElement等方法均未解决,目前仅能通过分开传递组件与props、再调用createElement的方式实现功能,但希望采用inputComponent的原生方案。

相关代码片段:

componentProps={{
  dateFormat: 'dd MMMM yyyy',
  className: `form-control ${
    errors?.startedDate ? 'is-invalid' : ''
  }`,
  selected: field.value,
  popperClassName: 'popper_datepicker',
}}
component={DatePicker}

// 当前可行的实现方式
createElement(customComponent, {
  ...componentProps,
  name,
  onChange,
  value,
})
解决思路
  • 检查组件导入正确性
    确认DatePicker的导出类型:若组件为默认导出,需使用默认导入语法;若为命名导出,需对应使用花括号导入。错误的导入方式会导致传入inputComponent的是undefined或非组件对象,触发类型错误。示例:

    // 错误:默认导出使用命名导入
    import { DatePicker } from 'react-datepicker';
    // 正确:默认导出使用默认导入
    import DatePicker from 'react-datepicker';
    
  • 确保传入组件而非实例
    inputComponent要求传入组件类/函数本身,不能传入渲染后的JSX实例。禁止写成inputComponent={<DatePicker />},必须直接传递inputComponent={DatePicker}。

  • 适配props传递逻辑
    MUI会自动向inputComponent传递TextField的核心props(如value、onChange、name),若自定义组件的prop名称不匹配(比如DatePicker用selected而非value),需要添加一层包装组件转换props:

    const WrappedDatePicker = (props) => {
      return <DatePicker selected={props.value} onChange={props.onChange} {...props} />;
    };
    
    // 在TextField中使用包装后的组件
    <TextField
      InputProps={{
        inputComponent: WrappedDatePicker,
        inputProps: componentProps // 传递DatePicker的额外自定义props
      }}
    />
    
  • 排查高阶组件包装问题
    若DatePicker经过高阶组件处理,需确保最终传入的是纯组件函数/类,而非包含额外属性的对象。例如部分库的导出结构可能嵌套,需提取真正的组件:

    import DatePickerModule from 'xxx-library';
    const DatePicker = DatePickerModule.Component; // 提取真正的组件
    

内容的提问来源于stack exchange,提问作者Jakub Koudela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:44:59