Material UI组件中forwarded ref使用问题:控制台报错排查
解决React forwardRef配合MUI Styled组件的ref传递报错问题
问题场景
控制台提示无法直接将ref传递给组件,需使用forwarded ref,已通过React.forwardRef包装组件,功能可正常运行,但控制台仍弹出红色错误,导致部署失败。
相关代码
用户实现的转发组件:
const ReffedInputBase = React.forwardRef((props, ref) => { // const inputSearch = useRef(); return (<StyledInputBase ref={ref} value={props.name} placeholder="Search…" inputProps={{ 'aria-label': 'search' }} onChange={({target: {value}}) => { props.setName(value) props.setOpen(true) }} />); }); ReffedInputBase.muiName = "StyledInputBase"; <ReffedInputBase name={name} setName={ setName} setOpen={ setOpen} ref={ref} />
Styled组件定义:
const StyledInputBase = styled(InputBase)(({ theme }) => ({ color: 'inherit', '& .MuiInputBase-input': { padding: theme.spacing(1, 1, 1, 0), paddingLeft: `calc(1em + ${theme.spacing(4)})`, transition: theme.transitions.create('width'), width: '100%', [theme.breakpoints.up('md')]: { width: '20ch', }, }, })); import InputBase from '@mui/material/InputBase';
问题原因
StyledInputBase是通过MUI styled工具包装InputBase生成的组件,直接传递ref时,这个ref会绑定到styled生成的外层容器元素(而非内部的InputBase组件),不符合React forwardRef的预期逻辑,从而触发报错。
解决方案
方案1:获取内部InputBase/实际输入框的ref(推荐)
InputBase组件本身提供了inputRef属性,用于获取底层input DOM元素的ref。修改转发组件,将ref通过inputRef传递:
const ReffedInputBase = React.forwardRef((props, ref) => { return ( <StyledInputBase inputRef={ref} // 替换ref为inputRef value={props.name} placeholder="Search…" inputProps={{ 'aria-label': 'search' }} onChange={({target: {value}}) => { props.setName(value) props.setOpen(true) }} /> ); }); // 移除muiName设置,避免MUI内部样式逻辑混淆 // ReffedInputBase.muiName = "StyledInputBase";
方案2:获取Styled组件外层容器的ref
如果确实需要styled生成的外层容器元素的ref,只需移除ReffedInputBase.muiName = "StyledInputBase";这一行即可。MUI的styled组件默认支持ref转发,设置同名muiName会导致内部逻辑冲突,引发报错。
额外检查
确保使用ReffedInputBase时的ref是通过useRef()正确创建的:
import { useRef } from 'react'; // 组件内部创建ref const inputRef = useRef(null); // 使用组件 <ReffedInputBase name={name} setName={setName} setOpen={setOpen} ref={inputRef} />
内容的提问来源于stack exchange,提问作者user19715801
相关产品推荐
相关产品推荐

