React Router V4 使用 Material UI 在 ListItem 中实现 NavLink

Posted

技术标签:

【中文标题】React Router V4 使用 Material UI 在 ListItem 中实现 NavLink【英文标题】:React Router V4 Implement NavLink inside a ListItem using Material UI 【发布时间】:2019-05-13 01:32:49 【问题描述】:

我是 React 新手,我创建了一个带有 LoginDashboard 页面的简单应用程序。我已成功配置我的 公共路线私人路线重定向 功能。但是,当我想实现 material-ui/core 时,事情仍然运行良好,但我无法实现我想要的 UI

下面是我的 NavBar 的旧实现:

const Navigation = () => 
    return (
        <div>
            <NavLink exact to="/" activeStyle= color: 'red' >Home</NavLink>
            <NavLink to="/about" activeStyle= color: 'red' >About</NavLink>
            <NavLink to="/contact" activeStyle= color: 'red' >Contact</NavLink>
        </div>
    )


export default Navigation

就这么简单,没有样式

但由于我想添加一些样式,所以我使用了ma​​terial/ui core,最后在下面做了一个新的:

export const MainNavigation = (
  <div>
    <ListItem button>
      <ListItemIcon>
        <DashboardIcon />
      </ListItemIcon>
      <ListItemText primary="Dashboard" />
    </ListItem>
    <ListItem button>
      <ListItemIcon>
        <ShoppingCartIcon />
      </ListItemIcon>
      <ListItemText primary="Orders" />
    </ListItem>
    <ListItem button>
      <ListItemIcon>
        <PeopleIcon />
      </ListItemIcon>
      <ListItemText primary="Customers" />
    </ListItem>
    <ListItem button>
      <ListItemIcon>
        <BarChartIcon />
      </ListItemIcon>
      <ListItemText primary="Reports" />
    </ListItem>
    <ListItem button>
      <ListItemIcon>
        <LayersIcon />
      </ListItemIcon>
      <ListItemText primary="Integrations" />
    </ListItem>
  </div>
);

现在第一个ListItem 如下所示:

但是当我在下面添加这行代码时:

<ListItemText primary=<NavLink exact to="/">Dashboard</NavLink> />

这是结果:

但我不希望这种情况发生。

我想保留第一个 UI 我不想让它看起来像一个 锚标记,下面有 下划线

如何处理与 react 路由器 NavLinkLink 集成的 Material/ui 中的 ListItem活动状态?以便我可以放置一些样式或使用活动类材料。

如果有人可以提供帮助,我们将不胜感激。 提前致谢。

【问题讨论】:

【参考方案1】:

使用 ListItem 的组件属性。要获得活动路线样式,请将 NavLink 的 activeClassName 设置为 Mui-selected。

<ListItem button component=NavLink to="/" activeClassName="Mui-selected" exact>
  ...
</ListItem>

【讨论】:

这行得通,但 React 抱怨:“警告:React 无法识别 DOM 元素上的 activeClassName 属性。如果您故意希望它作为自定义属性出现在 DOM 中,请将其拼写为小写activeclassname。如果您不小心从父组件传递了它,请将其从 DOM 元素中删除。”有什么想法吗? 什么版本的反应?什么版本的材料 UI 或反应路由器?在我发布此内容时,我没有收到该错误。 "react": "^17.0.1", "react-router-dom": "^5.2.0", "@material-ui/core": "^4.11.2".【参考方案2】:

您可以通过将 NavLink 设置为列表项的组件来实现。这是一个对我有用的例子!

<ListItem
  button
  key="Dashboard"
  component=NavLink to="/dashboard"
>
    <ListItemIcon>
        <Dashboard />
    </ListItemIcon>
    <ListItemText primary="Dashboard" />
</ListItem>

希望对你有帮助!

【讨论】:

如果其中一个链接被禁用,如何配置?

以上是关于React Router V4 使用 Material UI 在 ListItem 中实现 NavLink的主要内容,如果未能解决你的问题,请参考以下文章

使用 React Router v4 正确重定向

react-router v4 使用 history 控制路由跳转

[React Router V4] Create Basic Routes with the React Router v4 BrowserRouter

从 v3 迁移到 v4 react-router 时出现错误

react-router 从 v3 版本升到 v4 版本,升级小记

如何使用 react-router v4 检测路由变化?