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

如何将React Router激活态NavLink与MenuItem子组件集成?

这事儿其实很简单,react-router-dom的NavLink专门提供了方式来获取激活状态,给你两种实用的实现方案:

方法一:直接使用NavLink的children函数模式

这是最直接的写法,NavLink允许你把children写成一个函数,它会自动传入一个包含isActive状态的对象参数,你只需要把这个状态直接传给MenuItem的active属性就行:

<Menu>
  <NavLink to="link1">
    {/* 这里通过函数接收激活状态 */}
    {({ isActive }) => (
      <MenuItem active={isActive} text="link1" />
    )}
  </NavLink>
  <NavLink to="link2">
    {({ isActive }) => (
      <MenuItem active={isActive} text="link2" />
    )}
  </NavLink>
</Menu>

这个函数参数里还包含isPending(路由加载中的状态),如果你的项目用到了路由懒加载,可以顺便用这个状态做加载态提示,不过现在你只需要isActive就够了。

方法二:封装自定义组件(适合菜单较多的场景)

如果你的菜单选项很多,不想重复写children函数,可以封装一个复用性更强的自定义组件,结合useMatch钩子来判断路由匹配状态:

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

// 封装一个导航菜单组件
const NavMenuItem = ({ to, text }) => {
  // useMatch会判断当前路由是否和传入的to路径匹配
  const match = useMatch(to);
  // 把匹配结果转成布尔值,就是激活状态
  const isActive = !!match;

  return (
    <NavLink to={to}>
      <MenuItem active={isActive} text={text} />
    </NavLink>
  );
};

之后使用的时候就非常简洁了:

<Menu>
  <NavMenuItem to="link1" text="link1" />
  <NavMenuItem to="link2" text="link2" />
</Menu>

这种方式更干净,而且方便后续扩展菜单的其他功能(比如添加图标、权限控制等)。

注意:以上两种方案都适用于react-router-dom v6及以上版本,这也是目前的主流版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:05