解决Material UI Dialog组件open属性为undefined的prop类型警告
问题原因
警告触发的核心原因是MUI Dialog底层依赖的Modal组件,接收到的必填open属性值为undefined,不满足PropTypes校验规则。之所以业务功能还能正常跑,是因为undefined在JS里是假值,Dialog默认按关闭状态处理,不影响交互,但校验逻辑会一直抛警告。
结合你贴的代码,按以下优先级修改就能彻底解决:
修复步骤
1. 调整组件内声明顺序,修正状态命名
你现在把handleChange函数插在了两个state声明中间,虽然不会直接报语法错,但React函数组件执行时受临时死区影响,小概率出现状态值读取异常的问题,另外iopen命名太容易出现拼写失误。
先把所有state统一移到组件逻辑最顶部,所有事件处理函数放在state声明之后,把弹窗开关的状态名改成语义化的dialogOpen,明确传入初始值:
export default function SignIn() { const history = useNavigate(); // 所有state集中声明 const [dialogueMessage,setDialogueMessage] = useState('') const [checked, setChecked] = useState(true); const [dialogOpen, setDialogOpen] = useState(false); // 所有处理函数放在state之后 const handleChange = (event) => { setChecked(event.target.checked); }; const handleClickOpen = () => { setDialogOpen(true); }; const handleClose = () => { setDialogOpen(false); }; // handleSubmit逻辑保持不变,注意把里面调用setOpen的地方都改成setDialogOpen
然后修改Dialog标签上的open绑定,加布尔值强转兜底,彻底杜绝undefined传入:
<Dialog open={Boolean(dialogOpen)} TransitionComponent={Transition} // 先移除keepMounted属性,部分MUI小版本下这个属性会导致首次渲染传值异常 onClose={handleClose} aria-describedby="alert-dialog-slide-description" >
2. 修复自定义Transition组件的属性顺序
你现在写的Transition组件先绑定ref再展开props,会导致props里的内置ref覆盖手动绑定的ref,部分版本下会出现内部状态传值错误,调整下顺序,先展开props再绑定ref:
const Transition = React.forwardRef(function Transition(props, ref) { return <Slide direction="up" {...props} ref={ref} />; });
3. 依赖版本不一致兜底修复
如果上面两步改完还有警告,就是本地MUI相关依赖版本不匹配导致的内部传值bug,在项目根目录执行命令重装统一版本的依赖即可:
npm uninstall @mui/material @mui/icons-material @emotion/react @emotion/styled npm install @mui/material @mui/icons-material @emotion/react @emotion/styled
改完刷新页面警告就会完全消失,原有业务逻辑不会受任何影响。
内容的提问来源于stack exchange,提问作者radurbalau
相关产品推荐
相关产品推荐

