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

如何让makeStyles定义的样式优先级高于Material UI默认样式

问题本质

你遇到的样式覆盖问题是MUI v5版本的特性导致的:@mui/styles 是MUI v4的旧样式方案,在v5中属于遗留兼容包,默认生成的JSS样式注入顺序早于MUI核心组件基于Emotion生成的内置样式,当选择器特异性相同时,后注入的默认样式会覆盖你用makeStyles写的自定义样式,并非makeStyles无法用于自定义MUI组件。


解决方法(无需使用!important)

方法1:提升单个样式的选择器特异性(最推荐,灵活无侵入)

只需要在你要覆盖默认样式的类名样式外层包裹&&选择器,编译后会生成两个重复的类名选择器,特异性是MUI单个类选择器的2倍,必然覆盖默认样式:

const useStyles = makeStyles((theme) =>
  createStyles({
    differentButton:{
      // 加&&提升优先级
      '&&': {
        backgroundColor: 'green',
        fontSize: '30px',
        opacity: '80%',
      }
    },
    foo: (props) => ({
      '&&': {
        backgroundColor: props.backgroundColor,
      }
    }),
  }),
);

方法2:调整当前makeStyles的注入优先级

在创建makeStyles时传入第二个配置参数,设置index属性,数值越大样式注入位置越靠后,优先级越高,MUI默认样式的index值为1,设置大于1的数值即可让当前useStyles生成的所有样式优先级高于默认样式:

const useStyles = makeStyles((theme) =>
  createStyles({
    // 你的原有样式
  }),
  { index: 10 } // 数值大于1即可
);

方法3:全局配置JSS注入位置(适合项目大量使用makeStyles的场景)

在项目根组件外层包裹StylesProvider,统一配置JSS样式的插入位置,让所有makeStyles生成的样式都排在MUI Emotion样式的后面,优先级全局提升:

// 入口文件比如index.js
import { StylesProvider, jssPreset } from '@mui/styles';
import { create } from 'jss';
import App from './App';

const jss = create({
  ...jssPreset(),
  // 配置插入点到MUI Emotion样式之后
  insertionPoint: document.head.lastChild,
});

ReactDOM.render(
  <StylesProvider jss={jss}>
    <App />
  </StylesProvider>,
  document.getElementById('root')
);

额外注意事项

你当前代码中第一个<Button>组件没有被ThemeProvider包裹,自定义主题配置不会对它生效,如果需要所有组件复用自定义主题,需要把所有MUI组件都放到ThemeProvider的内部。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:54:04