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

将ListItemButton用作NavLink:为何选中时无默认激活样式?

为什么ListItemButton作为NavLink时无自动激活背景色?

问题根源

React Router的NavLink会在路由匹配时自动添加.active类,但MUI的ListItemButton组件默认样式里没有对.active类做任何样式定义,所以你移除手动写的sx样式后,自然看不到激活状态的视觉反馈。另外,ListItemButton自身的selected选中状态是独立的,和React Router的路由匹配状态没有自动绑定关系。

解决方法

方法1:用NavLink的动态样式函数

直接通过NavLink的style函数,根据isActive状态动态设置背景色:

<ListItem disablePadding key={user.id}>
  <ListItemButton
    component={NavLink}
    to={`/messages/${user.id}`}
    style={({ isActive }) => ({
      backgroundColor: isActive ? 'lightgray' : 'transparent'
    })}
  >
    <ListItemIcon>
      <PersonIcon />
    </ListItemIcon>
    <ListItemText primary={user.name} />
  </ListItemButton>
</ListItem>

方法2:结合useMatch控制selected属性

用React Router的useMatch钩子判断当前路由是否匹配,给ListItemButton设置selected属性,这样就能复用MUI内置的选中样式:

import { useMatch } from 'react-router-dom';

// 循环内部代码
const match = useMatch(`/messages/${user.id}`);
return (
  <ListItem disablePadding key={user.id}>
    <ListItemButton
      component={NavLink}
      to={`/messages/${user.id}`}
      selected={!!match}
    >
      <ListItemIcon>
        <PersonIcon />
      </ListItemIcon>
      <ListItemText primary={user.name} />
    </ListItemButton>
  </ListItem>
);

设置selected后,MUI会自动给按钮应用内置的选中背景色,不需要手动写sx样式。

方法3:全局主题统一配置

如果想让所有作为NavLink的ListItemButton都自动拥有激活样式,可以在MUI主题里全局配置:

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

const theme = createTheme({
  components: {
    MuiListItemButton: {
      styleOverrides: {
        root: {
          '&.active': {
            backgroundColor: 'lightgray',
            // 可按需添加字体颜色、边框等其他样式
          }
        }
      }
    }
  }
});

// 用ThemeProvider包裹你的组件树
<ThemeProvider theme={theme}>
  {/* 你的List组件代码 */}
</ThemeProvider>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:31:20