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

咨询MUI多种样式方法的差异、适用场景及选型时机

MUI 样式方法对比:差异、适用场景与时机

MUI 提供了多种样式方案,适配不同的开发习惯和场景,下面逐一拆解它们的核心差异、适用场景和使用时机:

1. makeStyles/useStyles(基于JSS的旧版方案)

这是 MUI v4 及更早版本的核心样式方案,现在 v5 中仅做兼容支持,官方不推荐新项目使用。

  • 核心差异:通过 makeStyles 定义样式对象,生成一个自定义钩子 useStyles,组件内调用该钩子获取自动生成的类名,再通过 className 绑定到元素上。样式基于 JSS 语法,支持主题注入、嵌套选择器等。
  • 适用场景:维护基于 v4 的旧项目;习惯 JSS 语法的开发者;需要复用复杂样式逻辑的组件。
  • 使用时机:仅用于老项目迭代,新项目请选择其他方案。
  • 示例代码:
import { makeStyles } from '@mui/styles';

const useStyles = makeStyles((theme) => ({
  root: {
    color: theme.palette.primary.main,
    padding: theme.spacing(2),
  },
}));

function MyComponent() {
  const classes = useStyles();
  return <div className={classes.root}>Hello MUI</div>;
}

2. styled(组件式CSS-in-JS方案)

MUI v5 推荐的方案之一,基于 emotion 实现,语法和 styled-components 完全一致。

  • 核心差异:直接创建带样式的自定义组件,无需手动管理类名,样式自动隔离,支持主题变量和动态样式(通过组件 props 传递参数)。
  • 适用场景:构建可复用的独立 UI 组件(如自定义按钮、卡片、布局组件);喜欢组件化样式写法的开发场景;需要将样式与组件逻辑深度绑定的场景。
  • 使用时机:新项目开发中,需要封装可复用组件时优先使用。
  • 示例代码:
import { styled } from '@mui/material/styles';
import Box from '@mui/material/Box';

const StyledBox = styled(Box)(({ theme, isActive }) => ({
  color: isActive ? theme.palette.secondary.main : theme.palette.text.primary,
  border: `1px solid ${theme.palette.divider}`,
}));

function MyComponent() {
  return <StyledBox isActive>Styled Component</StyledBox>;
}

3. useTheme(主题访问工具)

这不是直接生成样式的方案,而是用于获取 MUI 主题配置的钩子。

  • 核心差异:仅提供主题对象的访问能力,包含主题定义的颜色、间距、断点、排版等配置,需配合其他样式方案使用。
  • 适用场景:任何需要动态读取主题变量的场景,比如根据主题模式(亮色/暗色)切换样式;自定义组件适配不同主题配置。
  • 使用时机:当样式逻辑依赖主题变量时,与 styled、sx、makeStyles 等方案配合使用。
  • 示例代码:
import { useTheme } from '@mui/material/styles';
import Box from '@mui/material/Box';

function MyComponent() {
  const theme = useTheme();
  return (
    <Box sx={{ color: theme.palette.primary.dark }}>
      Using theme variable
    </Box>
  );
}

4. sx Prop(增强型内联样式方案)

MUI v5 新增的核心方案,所有 MUI 组件都自带该 prop,是快速开发的首选。

  • 核心差异:采用内联式写法,但比原生 inline style 强大得多——支持主题变量、响应式断点、CSS 伪类/伪元素、简写属性,样式会自动注入到页面,且支持优先级控制。
  • 适用场景:原型开发快速验证样式;页面内单个组件的局部样式调整;不需要复用的小范围样式修改。
  • 使用时机:日常开发中,给组件快速添加样式时优先使用,无需额外创建样式组件或钩子。
  • 示例代码:
import Box from '@mui/material/Box';

function MyComponent() {
  return (
    <Box
      sx={{
        color: 'primary.main',
        padding: 2,
        '&:hover': { backgroundColor: 'primary.light' },
        '@media (min-width:600px)': { fontSize: '1.2rem' },
      }}
    >
      Using sx prop
    </Box>
  );
}

5. css Prop(原生CSS语法方案)

基于 emotion 实现,需要额外配置才能使用,适合习惯原生 CSS 语法的开发者。

  • 核心差异:支持直接书写完整的 CSS 字符串,支持 emotion 的所有特性(如关键帧动画、全局样式),同样可以配合主题变量使用。
  • 适用场景:需要编写复杂原生 CSS 逻辑(如自定义关键帧动画、复杂嵌套选择器)的场景;习惯原生 CSS 写法,不喜欢对象式样式的开发者。
  • 使用时机:当 sx prop 满足不了复杂 CSS 需求时使用。
  • 示例代码:
import { css } from '@mui/material/styles';
import Box from '@mui/material/Box';

const customStyle = css((theme) => `
  color: ${theme.palette.primary.main};
  @keyframes fadeIn {
    from { opacity: 0; }
    to { opacity: 1; }
  }
  animation: fadeIn 0.5s ease-in;
`);

function MyComponent() {
  return <Box css={customStyle}>Using css prop</Box>;
}

选择建议

  • 新项目优先用 sx prop(快速开发)或 styled(复用组件)
  • 老项目维护保留 makeStyles
  • 任何依赖主题变量的场景,搭配 useTheme
  • 复杂原生CSS需求用 css prop

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:57:24