使用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
相关产品推荐
相关产品推荐

