Material UI v5使用makeStyles访问theme.mixins.toolbar报未定义错误
报错根因
你的问题核心是Material UI v4和v5的包混用、上下文不互通,叠加代码拼写错误导致的,具体原因如下:
- 你同时使用了v4版本的
@material-ui/开头的包,和v5版本的@mui/开头的包,两个版本的ThemeProvider、样式工具上下文完全独立不共享:你用v4的ThemeProvider传递的自定义theme,v5的组件、v4的makeStyles都无法正常读取,导致theme.mixins为undefined,读取toolbar就抛出了对应报错。 makeStyles在v5中已经是废弃的legacy方案,就算要用也需要从@mui/styles导入,而不是你现在用的@material-ui/styles,且需要额外安装emotion相关依赖才能正常工作。- 代码存在拼写错误:你定义的类名是
toolbarMargin,实际使用时写的是toolBarMargin,大小写不匹配,就算前面的问题修复也会导致样式不生效。
修复步骤
- 统一所有导入为v5标准包,替换所有
@material-ui开头的导入:app.js中ThemeProvider改为从@mui/material/styles导入Theme.js中createTheme改为从@mui/material/styles导入- 如果要继续使用
makeStyles,先安装依赖npm install @mui/styles @emotion/react @emotion/styled,再将Header中makeStyles的导入改为import { makeStyles } from "@mui/styles";
- 修正Header中的类名拼写:将
<div className={classes.toolBarMargin} />改为<div className={classes.toolbarMargin} />
更推荐的v5写法(无需使用makeStyles)
v5官方推荐用styled方案实现单个组件的样式自定义,不需要安装额外的legacy依赖,写法更简洁:
// header/index.jsx 替换makeStyles相关代码 import { styled } from '@mui/material/styles'; // 替代原来的useStyles定义 const ToolbarMargin = styled('div')(({ theme }) => ({ ...theme.mixins.toolbar, })); function Header() { return ( <React.Fragment> <ElevationScroll> <AppBar color="primary"> <Toolbar> <Typography variant="h3" component="h3"> Nome de teste </Typography> </Toolbar> </AppBar> </ElevationScroll> {/* 直接用组件代替原来的div */} <ToolbarMargin /> </React.Fragment> ); }
内容的提问来源于stack exchange,提问作者Maximilian Kaden
相关产品推荐
相关产品推荐

