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

使用React Hook Form与MUI DatePicker时如何消除Ref警告?

消除MUI DatePicker结合React Hook Form的Ref警告

问题原因

控制台出现的Warning: Function components cannot be given refs...警告,根源在于:

  • React Hook Form的Controller组件会自动向渲染的表单组件传递ref,但MUI的DatePicker是函数组件,默认不接收外部ref。
  • 你的代码中同时使用了Controller和register,属于重复绑定操作,register返回的ref会额外传递给组件,进一步触发警告。

解决方法

方法一:直接传递ref到DatePicker的inputRef属性

MUI的DatePicker提供了inputRef属性,用于将ref传递给内部的输入框元素。只需将Controller的field.ref绑定到该属性,同时移除多余的register调用即可:

<Controller
  control={control}
  name="DOB"
  render={({ field }) => (
    <LocalizationProvider dateAdapter={AdapterDayjs}>
      <DatePicker
        value={field.value ? field.value : dayjs(defaultvalues.DOB)}
        onChange={(val) => field.onChange(val)}
        id="DOB"
        format="YYYY-MM-DD"
        label={t("Date of Bearth")}
        inputRef={field.ref}
      />
    </LocalizationProvider>
  )}
/>

方法二:用forwardRef包裹DatePicker(可选)

如果需要直接给DatePicker组件传递ref,可以用React.forwardRef包裹它,将外部ref转发到inputRef:

// 定义转发ref的DatePicker组件
const ForwardedDatePicker = React.forwardRef((props, ref) => (
  <DatePicker {...props} inputRef={ref} />
));

// 在Controller中使用
<Controller
  control={control}
  name="DOB"
  render={({ field }) => (
    <LocalizationProvider dateAdapter={AdapterDayjs}>
      <ForwardedDatePicker
        value={field.value ? field.value : dayjs(defaultvalues.DOB)}
        onChange={(val) => field.onChange(val)}
        id="DOB"
        format="YYYY-MM-DD"
        label={t("Date of Bearth")}
        ref={field.ref}
      />
    </LocalizationProvider>
  )}
/>

关键注意点

  • 禁止同时使用Controller和register:Controller已通过name属性绑定表单字段,register是针对非受控组件的绑定方式,两者混用会导致重复的ref传递和逻辑冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:25:35