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

如何为React-Router 6的NavLink简洁设置多个类名(含激活态)

你可以试试这几种更简洁的写法,不用重复写classes.link:

  • 数组过滤法:
    把基础类和条件类放进数组,用filter(Boolean)过滤掉假值,再转成空格分隔的类名字符串,逻辑清晰且避免重复:

    <NavLink
      to={category.url}
      state={category}
      onClick={closeMenu}
      className={() => [
        classes.link,
        category.id === locationId && classes.active
      ].filter(Boolean).join(' ')}
    >
      {category.name}
    </NavLink>
    
  • 简化模板字符串:
    因为基础类classes.link始终需要,直接把它写在前面,条件类只在满足时追加,不用写两次classes.link:

    <NavLink
      to={category.url}
      state={category}
      onClick={closeMenu}
      className={() => `${classes.link} ${category.id === locationId ? classes.active : ''}`}
    >
      {category.name}
    </NavLink>
    

    注:这里的空字符串不会影响CSS渲染,浏览器会自动忽略多余空格。

  • 借助工具库(可选):
    如果项目允许引入第三方工具库,classnames是处理动态类名的常用选择,写法更直观:
    先安装包:npm install classnames
    然后使用:

    import classnames from 'classnames';
    
    // ...
    
    <NavLink
      to={category.url}
      state={category}
      onClick={closeMenu}
      className={classnames(classes.link, {
        [classes.active]: category.id === locationId
      })}
    >
      {category.name}
    </NavLink>
    

另外,React Router 6的NavLink本身给className的回调函数提供了isActive参数,如果你的激活判断是基于路由匹配(而非自定义的category.id === locationId),还可以直接用这个参数进一步简化:

<NavLink
  to={category.url}
  state={category}
  onClick={closeMenu}
  className={({ isActive }) => [classes.link, isActive && classes.active].filter(Boolean).join(' ')}
>
  {category.name}
</NavLink>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:15:32