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

使用MUI主题时'use client'的最佳实践及服务端组件适配疑问

如何在MUI主题自定义样式时保持组件为服务端组件

可以通过两种方式避免添加'use client'指令,让组件维持服务端组件的特性:

1. 通过父组件传递主题样式值

让能访问主题的父组件(通常是客户端组件)提取所需的样式参数,传递给子组件。子组件无需使用useTheme钩子,仍可作为服务端组件:

父组件(客户端组件)

"use client";
import { useTheme } from "@mui/material";
import CustomComp from "./CustomComp";

const ParentComponent = ({ data }) => {
  const theme = useTheme();
  return <CustomComp data={data} bgColor={theme.palette.customColor} />;
};

子组件(服务端组件)

import { Box } from "@mui/material";

const CustomComp = ({ data, bgColor }) => {
  return (
    <Box height={100} width={100} sx={{ backgroundColor: bgColor }}>
      {data}
    </Box>
  );
};

export default CustomComp;

2. 直接导入静态主题对象

如果你的MUI主题是预先定义的静态对象(而非动态生成),可以直接在服务端组件中导入主题文件,无需依赖客户端钩子:

主题定义文件(theme.js)

import { createTheme } from "@mui/material/styles";

export const appTheme = createTheme({
  palette: {
    customColor: "#1976D2",
  },
});

服务端组件

import { Box } from "@mui/material";
import { appTheme } from "./theme";

const CustomComp = ({ data }) => {
  return (
    <Box height={100} width={100} sx={{ backgroundColor: appTheme.palette.customColor }}>
      {data}
    </Box>
  );
};

export default CustomComp;

注意事项

  • 如果主题是动态切换的(比如跟随用户深色/浅色模式偏好),直接导入静态主题的方式不适用,此时推荐使用父组件传递样式值的方案。
  • 只有当组件需要直接使用客户端钩子(如useTheme、useMediaQuery)时,才必须添加'use client'转为客户端组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:12:08