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

Material UI v5中makeStyles的替代方案是什么?如何迁移适配原有样式?

MUI v5 样式迁移解决方案

前置说明

你是JS项目,不需要添加任何TypeScript相关的类型声明文件,之前加的ts文件可以直接删除,对你的问题没有任何帮助。
你的主题配置本身没有问题,无法识别是因为MUI v5 已经将makeStyles标记为废弃方案,默认不再内置,需要单独安装依赖才能使用,而MUI原生的新样式方案(sx属性/styled API)完全不需要额外配置就能直接读取你定义的全局主题。


方案1:使用sx属性直接改写(最简单,推荐)

直接在组件上用sx属性写样式,所有样式定义中可以直接读取theme对象的配置,不需要额外定义useStyles:

import { useState, useEffect } from "react";
import { AppBar, Toolbar, Typography, Tabs, Tab } from "@mui/material";
import { Link } from "react-router-dom";
// 直接删除原来的makeStyles相关代码即可

export default function Navigation(props) {
    const [value, setValue] = useState(0);

    const handleChange = (e, value) => {
        setValue(value);
    };
    const refreshPage = () => {
        window.location.reload();
    };
    
    useEffect(() => {
        switch (window.location.pathname) {
            case "/":
                if (value !== 0) {
                    setValue(0);
                }
                break;
                default:
                break;
        }
    }, [value]);


    return (
      <React.Fragment>
        <ElevationScroll>
          <AppBar
            position="relative"
            sx={{ borderBottom: "2px solid black" }}
          >
            <Toolbar disableGutters>
                <img 
                  src={logo} 
                  alt="nasa logo"
                  sx={{
                    height: "8em",
                    marginLeft: "0.2em",
                  }}
                />
                <Typography variant="h1" sx={{ textAlign: "center" }}>
                  Nasa<br/>Photos
                </Typography>
                <Tabs
                  value={value}
                  onChange={handleChange}
                  sx={{ marginLeft: "auto" }}
                  indicatorColor="primary"
                >
                  <Tab
                    sx={{
                      ...theme.typography.tab,
                      minWidth: 10,
                      marginRight: "50px",
                      opacity: 1,
                      // 注意原代码少了冒号,hover不会生效,此处已修正
                      "&:hover": {
                          color: theme => theme.palette.common.purple,
                          textDecoration:"none",
                      },
                    }}
                    component={Link}
                    onClick={refreshPage}
                    to="/"
                    label="Home"
                  />
                </Tabs>
            </Toolbar>
          </AppBar>
        </ElevationScroll>
      </React.Fragment>
    );
}

方案2:使用styled API改写(和原makeStyles用法更接近)

如果更喜欢原来的类名调用风格,可以用styled API定义样式组件:

import { styled } from "@mui/material/styles";
import { Tabs, Tab } from "@mui/material";

// 定义样式组件
const LogoImg = styled('img')(({ theme }) => ({
  height: "8em",
  marginLeft: "0.2em",
}));

const StyledTabs = styled(Tabs)(({ theme }) => ({
  marginLeft: "auto",
}));

const StyledTab = styled(Tab)(({ theme }) => ({
  ...theme.typography.tab,
  minWidth: 10,
  marginRight: "50px",
  opacity: 1,
  "&:hover": {
      color: theme.palette.common.purple,
      textDecoration:"none",
  },
}));

// 组件内直接用上面定义的组件替换原来的原生组件即可
export default function Navigation(props) {
  // 原有逻辑保持不变
  return (
    // 其余代码保持不变
    <LogoImg src={logo} alt="nasa logo"/>
    {/* 替换Tabs为StyledTabs,替换Tab为StyledTab即可 */}
    <StyledTabs
      value={value}
      onChange={handleChange}
      indicatorColor="primary"
    >
      <StyledTab
        component={Link}
        onClick={refreshPage}
        to="/"
        label="Home"
      />
    </StyledTabs>
  )
}

补充说明

如果你非要继续用makeStyles,需要先安装@mui/styles依赖,并且在App.js外层包裹StyledEngineProvider指定用jss引擎,但这个方案是MUI为了兼容旧版本保留的,不推荐使用,性能不如新的emotion方案。

内容的提问来源于stack exchange,提问作者Natsuko Izuki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:36:01