React StrictMode下findDOMNode弃用警告含义、成因及解决方法
警告产生原因
这个警告和你的业务代码无关:
- 你当前项目使用的Material UI v4版本中,
Menu组件内部的旧版Transition动画实现,仍在调用React已标记为弃用的findDOMNodeAPI获取DOM实例 - 只要组件树被React StrictMode包裹,树内任何代码调用
findDOMNode,就会在控制台输出对应弃用提示 - 该警告不影响组件正常运行,仅代表当前使用的第三方组件内部实现没跟上React最新的规范要求
不移除StrictMode的处理方案
完全可以在保留StrictMode的前提下解决这个问题,不需要靠移除StrictMode兜底:
- 长期最优解:升级到适配React 18的Material UI v5版本。MUI v5已经彻底清掉了核心组件内部对
findDOMNode的所有调用,所有需要获取DOM引用的场景全改成了标准ref透传写法,升级后这个警告会直接消失,还能完整保留StrictMode的开发期检查能力。你代码里用的withStyles、旧版makeStyles都是MUI v4的标志性API,v5有对应兼容层,不会因为样式API阻塞升级。 - 临时过渡方案:如果项目周期紧,暂时没法做大版本升级,可以在项目入口对这条特定警告做定向拦截。毕竟这个警告是第三方库内部旧代码触发的,没有实际调试价值:
// 保留原始warn方法,别把其他正常警告屏蔽了 const originalWarn = console.warn; console.warn = (...args) => { // 只拦截findDOMNode弃用的那条提示 if (typeof args[0] === 'string' && args[0].includes('findDOMNode is deprecated in StrictMode')) { return; } originalWarn.apply(console, args); };
踩坑提醒:网上很多帖子说要给Menu传自定义Transition绑ref就能解决警告,在MUI v4里这方法根本没用。因为v4的Menu内部渲染Transition的逻辑压根没暴露ref绑定通道,你外部传的ref根本碰不到那个调用
findDOMNode的内部代码,从根上修不了这个问题。
另外你现在把Link套在StyledMenuItem外面的写法虽然能正常跑,但不符合MUI Menu的设计逻辑,后面迁v5的时候可以直接给MenuItem加component={Link}和对应to属性,不用额外包一层Link。
内容的提问来源于stack exchange,提问作者Ahmed Abid
相关产品推荐
相关产品推荐

