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

Material UI TreeView标签字体大小修改后刷新失效问题求助

Material UI TreeView自定义字体大小刷新后失效问题

问题现象

使用Material UI TreeView组件时,在TreeItem的sx属性中自定义标签字体大小,仅在项目启动后修改代码并保存(热重载)时能看到效果,关闭项目或刷新页面后自定义样式完全消失。相关代码示例:

<TreeItem
  key={mainCategory.name}
  nodeId={mainCategory.name}
  label={mainCategory.name}
  disabled={
    !mainCategory.department?.includes(employee?.currentUser?.role!) &&
    !mainCategory.department?.includes("all")
  }
  sx={{
    paddingBottom: "1rem",
    fontSize: "1.9rem",
    "& .MuiTreeItem-label": {
      fontSize: "1.8rem",
    },
  }}
>
  {renderSubCategories(mainCategory.name)}
</TreeItem>

完整组件代码如下:

interface ChildProps {
  accordianCat: Categories[];
}

const TreeViewComp = ({ accordianCat }: ChildProps) => {
  const { employee } = useTypedSelector((state) => state);
  const { allEmployees } = useTypedSelector((state) => state);

  const handleClick = (name: string, department: string) => {
    console.log(name, department);
  };

  const renderSubCategories = (mainCategoryName: string) =>
    accordianCat
      .filter(
        (category) =>
          category.type === "sub" &&
          category.department?.includes(mainCategoryName)
      )
      .map((subCategory) =>
        subCategory.name === "Employees" ? (
          allEmployees?.allEmployeesData
            ?.filter((employee) => employee.role === mainCategoryName)
            .map((employee) => (
              <TreeItem
                key={employee.name}
                nodeId={employee.uuid}
                label={`${fullName(employee)}`}
                sx={{
                  paddingBottom: "0.8rem",
                  "& .MuiTreeItem-label": {
                    fontSize: "1.8rem",
                  },
                }}
              />
            ))
        ) : (
          <TreeItem
            key={subCategory.name}
            nodeId={subCategory.name}
            label={subCategory.name}
            sx={{
              paddingBottom: "0.8rem",
              "& .MuiTreeItem-label": {
                fontSize: "1.8rem",
              },
            }}
          />
        )
      );

  const renderMainCategories = () =>
    accordianCat
      .filter((category) => category.type === "main")
      .map((mainCategory) => (
        <TreeItem
          key={mainCategory.name}
          nodeId={mainCategory.name}
          label={mainCategory.name}
          disabled={
            !mainCategory.department?.includes(employee?.currentUser?.role!) &&
            !mainCategory.department?.includes("all")
          }
          sx={{
            paddingBottom: "1rem",
            fontSize: "1.9rem",
            "& .MuiTreeItem-label": {
              fontSize: "1.8rem",
            },
          }}
        >
          {renderSubCategories(mainCategory.name)}
        </TreeItem>
      ));

  return (
    <TreeView
      aria-label="file system navigator"
      defaultCollapseIcon={<ExpandMoreIcon />}
      defaultExpandIcon={<ChevronRightIcon />}
      sx={{
        height: 240,
        flexGrow: 1,
        maxWidth: 400,
        overflowY: "auto",
      }}
    >
      {renderMainCategories()}
    </TreeView>
  );
};

export default TreeViewComp;

原因分析

核心问题是CSS样式优先级冲突:Material UI内置的TreeItem标签样式优先级高于你通过sx添加的内联样式。热重载时样式加载顺序临时改变,自定义样式暂时生效;刷新或重启项目后,内置样式正常加载并覆盖了自定义样式。

解决方案

方案1:使用styled组件创建自定义TreeItem

通过Material UI的styled工具创建带有固定样式的TreeItem组件,确保样式优先级高于内置样式:

import { styled } from '@mui/material/styles';
import TreeItem from '@mui/lab/TreeItem';

// 子分类/员工项的样式
const StyledTreeItem = styled(TreeItem)(() => ({
  paddingBottom: '0.8rem',
  '& .MuiTreeItem-label': {
    fontSize: '1.8rem',
  },
}));

// 主分类的专属样式
const MainTreeItem = styled(TreeItem)(() => ({
  paddingBottom: '1rem',
  '& .MuiTreeItem-label': {
    fontSize: '1.9rem',
  },
}));

替换组件中的原有TreeItem:

// 主分类使用MainTreeItem
<MainTreeItem
  key={mainCategory.name}
  nodeId={mainCategory.name}
  label={mainCategory.name}
  disabled={
    !mainCategory.department?.includes(employee?.currentUser?.role!) &&
    !mainCategory.department?.includes("all")
  }
>
  {renderSubCategories(mainCategory.name)}
</MainTreeItem>

// 子分类和员工项使用StyledTreeItem
<StyledTreeItem
  key={employee.name}
  nodeId={employee.uuid}
  label={`${fullName(employee)}`}
/>

方案2:提升sx选择器的特异性

在sx属性中使用更具体的选择器,确保自定义样式优先级更高:

sx={{
  paddingBottom: "1rem",
  // 增加父级选择器提升特异性
  '&.MuiTreeItem-root .MuiTreeItem-label': {
    fontSize: '1.9rem',
  },
}}

方案3:全局主题覆盖

在项目的主题配置文件中全局修改TreeItem的默认样式:

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

const theme = createTheme({
  components: {
    MuiTreeItem: {
      styleOverrides: {
        // 全局默认标签字体大小
        label: {
          fontSize: '1.8rem',
        },
        // 全局默认根节点内边距
        root: {
          paddingBottom: '0.8rem',
        },
        // 主分类专属样式,需给主TreeItem添加className="main-tree-item"
        '&.main-tree-item': {
          paddingBottom: '1rem',
          '& .MuiTreeItem-label': {
            fontSize: '1.9rem',
          },
        },
      },
    },
  },
});

然后给主分类TreeItem添加对应的类名:

<TreeItem
  className="main-tree-item"
  // 其他属性保持不变
>

验证方式

修改完成后重启项目或刷新页面,检查TreeItem的字体大小是否保持自定义值,同时确认热重载时样式依然正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:14:53