You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,大小写不匹配,就算前面的问题修复也会导致样式不生效。

修复步骤

  1. 统一所有导入为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";
  2. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:27:05