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

如何映射数组对象中的MUI 5图标并修改选中项图标颜色?

MUI5侧边栏选中项图标颜色修改方案

下面提供三种可行的解决方法,你可以根据现有代码结构选择:

方案一:改造路由配置,传递图标组件而非实例

修改routes.tsx中的图标配置,从渲染好的元素改为组件本身,这样就能在Sidebar中动态传递颜色属性:

routes.tsx 修改后

export const SIDEBAR_PATHS = [
  {
    id: 1,
    path: PATHS.projects,
    name: 'Projects',
    icon: AccountTreeIcon, // 仅传递组件,不渲染
  },
  {
    id: 2,
    path: PATHS.faces,
    name: 'Faces',
    icon: FaceRetouchingNaturalIcon,
  },
];

Sidebar.tsx 修改后

{SIDEBAR_PATHS.map(({ id, path, name, icon: Icon }) => {
  const isSelected = path === pathname;
  return (
    <ListItem key={id} disablePadding>
      <ListItemButton 
        disableRipple 
        onClick={() => navigate(path)} 
        selected={isSelected}
      >
        {/* 根据选中状态设置图标颜色 */}
        <Icon color={isSelected ? "primary" : "inherit"} />
        <ListItemText 
          primary={name} 
          primaryTypographyProps={{ fontWeight: 500 }} 
        />
      </ListItemButton>
    </ListItem>
  );
})}

方案二:用React.cloneElement修改已有图标属性

如果不想改动路由配置,可以通过React.cloneElement给已渲染的图标添加颜色属性:

Sidebar.tsx 修改后

import React from 'react';

{SIDEBAR_PATHS.map(({ id, path, name, icon }) => {
  const isSelected = path === pathname;
  // 克隆图标并传入颜色props
  const coloredIcon = React.cloneElement(icon, {
    color: isSelected ? "primary" : "inherit"
  });
  
  return (
    <ListItem key={id} disablePadding>
      <ListItemButton 
        disableRipple 
        onClick={() => navigate(path)} 
        selected={isSelected}
      >
        {coloredIcon}
        <ListItemText 
          primary={name} 
          primaryTypographyProps={{ fontWeight: 500 }} 
        />
      </ListItemButton>
    </ListItem>
  );
})}

方案三:通过CSS选择器控制样式

利用MUI的sx属性,通过父元素的选中状态直接修改图标颜色,无需改动图标本身:

Sidebar.tsx 修改后

{SIDEBAR_PATHS.map(({ id, path, name, icon }) => (
  <ListItem key={id} disablePadding>
    <ListItemButton 
      disableRipple 
      onClick={() => navigate(path)} 
      selected={path === pathname}
      sx={{
        // 选中状态下,修改内部图标的颜色
        '&.Mui-selected .MuiSvgIcon-root': {
          color: 'primary.main',
        }
      }}
    >
      {icon}
      <ListItemText 
        primary={name} 
        primaryTypographyProps={{ fontWeight: 500 }} 
      />
    </ListItemButton>
  </ListItem>
))}

说明

  • 方案一灵活性最高,后续可以给图标传递更多自定义属性;
  • 方案二适合需要保留原有路由结构的场景;
  • 方案三纯样式层面解决,代码改动最小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:35:14