# MUI (Material-UI) 主题系统完整指南
# 1. 基础配置
# 1.1 必要的导入
import {
createTheme,
ThemeProvider,
StyledEngineProvider
} from '@mui/material/styles';
# 1.2 基本主题设置
const theme = createTheme({
palette: {
primary: {
main: '#1976d2',
light: '#42a5f5',
dark: '#1565c0'
},
secondary: {
main: '#9c27b0'
}
},
typography: {
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
h1: {
fontSize: '2.5rem',
fontWeight: 500
}
}
});
# 1.3 主题提供者设置
function App() {
return (
<StyledEngineProvider injectFirst>
<ThemeProvider theme={theme}>
<App />
</ThemeProvider>
</StyledEngineProvider>
);
}
# 2. 使用主题
# 2.1 在组件中访问主题
import { useTheme } from '@mui/material/styles';
function MyComponent() {
const theme = useTheme();
return (
<Button
sx={{
backgroundColor: theme.palette.primary.main,
'&:hover': {
backgroundColor: theme.palette.primary.dark
}
}}
>
主题色按钮
</Button>
);
}
# 2.2 响应式主题设计
const theme = createTheme({
breakpoints: {
values: {
xs: 0, // 手机
sm: 600, // 平板
md: 900, // 小型笔记本
lg: 1200, // 桌面显示器
xl: 1536, // 大屏幕
},
},
components: {
MuiButton: {
styleOverrides: {
root: {
fontSize: '1rem',
[theme.breakpoints.up('sm')]: {
fontSize: '1.2rem',
},
},
},
},
},
});
# 3. 高级功能
# 3.1 深色/浅色模式切换
function App() {
const [mode, setMode] = useState('light');
const theme = useMemo(
() =>
createTheme({
palette: {
mode,
},
}),
[mode],
);
return (
<ThemeProvider theme={theme}>
<Button onClick={() => setMode(mode === 'light' ? 'dark' : 'light')}>
切换主题
</Button>
</ThemeProvider>
);
}
# 3.2 主题嵌套
<ThemeProvider theme={outerTheme}>
<div>
<Button>外层主题按钮</Button>
<ThemeProvider theme={innerTheme}>
<Button>内层主题按钮</Button>
</ThemeProvider>
</div>
</ThemeProvider>
# 3.3 组件默认样式设置
const theme = createTheme({
components: {
MuiButton: {
defaultProps: {
variant: 'contained',
size: 'small',
},
styleOverrides: {
root: {
textTransform: 'none',
},
},
},
},
});
# 4. 最佳实践
# 4.1 StyledEngineProvider 使用建议
- 总是将
StyledEngineProvider
放在应用的最外层 - 使用
injectFirst
属性确保 MUI 样式优先级 - 有助于正确处理样式覆盖问题
# 4.2 性能优化建议
- 使用
useMemo
缓存主题对象 - 避免在渲染过程中创建新的主题对象
- 将主题配置抽离到单独的文件中维护
# 4.3 主题组织建议
- 为不同的设计变体创建单独的主题文件
- 使用常量管理颜色、尺寸等主题变量
- 建立完整的设计令牌(Design Tokens)系统
# 5. 注意事项
- 确保在应用顶层配置主题提供者
- 注意样式优先级管理
- 合理使用响应式断点
- 避免过度的主题嵌套
- 保持主题配置的一致性
# 6. 常见问题解决
- 样式未生效:检查 StyledEngineProvider 配置
- 主题变量未更新:检查 useMemo 依赖项
- 响应式不生效:确认断点设置正确
- 样式覆盖问题:检查样式优先级和 sx 属性使用
# 7. 参考资源
基建 web3