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

使用clsx库实现导航栏激活链接时出现异常行为

问题:使用clsx固定路径判断时导航链接全部高亮

我在学习用clsx组合条件CSS类,实现导航栏激活链接功能。原本用pathname === link.href判断时,代码运行正常,对应路径的链接会正确高亮。但把判断条件里的link.href改成固定值比如'/dashboard'或'/dashboard/invoice'后,所有导航链接都被高亮了,而不是只有对应路径的链接。

初始正常代码

'use client';

import clsx from 'clsx';
import Link from 'next/link';
import { usePathname } from 'next/navigation'

const links = [
  { name: 'Home', 
  href: '/dashboard', 
  icon: HomeIcon },
  {
    name: 'Invoices',
    href: '/dashboard/invoices',
    icon: DocumentDuplicateIcon,
  },
  { name: 'Customers', 
  href: '/dashboard/customers', 
  icon: UserGroupIcon },
];

export default function NavLinks() {
  const pathname = usePathname()
  return (
    <>
      {links.map((link) => {
        const LinkIcon = link.icon;
        console.log(link.href);
        return (
          <Link
            key={link.name}
            href={link.href}
            className={clsx('flex h-[48px] grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3',
            {'bg-red-200 text-red-600': pathname === link.href}
            )}
          >
            <LinkIcon className="w-6" />
            <p className="hidden md:block">{link.name}</p>
          </Link>
        );
      })}
    </>
  );
}

修改后出现问题的代码

'use client';

import clsx from 'clsx';
import Link from 'next/link';
import { usePathname } from 'next/navigation'

const links = [
  { name: 'Home', 
  href: '/dashboard', 
  icon: HomeIcon },
  {
    name: 'Invoices',
    href: '/dashboard/invoices',
    icon: DocumentDuplicateIcon,
  },
  { name: 'Customers', 
  href: '/dashboard/customers', 
  icon: UserGroupIcon },
];

export default function NavLinks() {
  const pathname = usePathname()
  return (
    <>
      {links.map((link) => {
        const LinkIcon = link.icon;
        return (
          <Link
            key={link.name}
            href={link.href}
            className={clsx('flex h-[48px] grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3',
            {'bg-red-200 text-red-600': pathname === '/dashboard'}
            )}
          >
            <LinkIcon className="w-6" />
            <p className="hidden md:block">{link.name}</p>
          </Link>
        );
      })}
    </>
  );
}

原因分析

当你把判断条件改成固定的pathname === '/dashboard'时,在遍历所有导航链接的循环中,每个链接都会执行这个判断:只要当前页面路径确实是/dashboard,所有链接的条件都会成立,因此每个链接都会被加上高亮的CSS类。

而最初使用pathname === link.href的逻辑是正确的——循环中的每个链接对应不同的href值,只有当当前路径和该链接自身的href完全匹配时,才会触发高亮,这样只会激活对应路径的导航项。

解决方案

根据你的需求选择对应的方案:

1. 保持每个链接对应自身路径的激活逻辑

直接回到初始代码的判断方式,这是导航激活最通用的实现:

{'bg-red-200 text-red-600': pathname === link.href}

2. 给指定单个链接添加固定路径判断

比如只想让Home链接在路径为/dashboard时高亮,其他链接保持原有逻辑:

{'bg-red-200 text-red-600': link.href === '/dashboard' && pathname === '/dashboard'}

如果想让Home链接在/dashboard及其所有子路径下都高亮(比如/dashboard/invoices时也高亮Home):

{'bg-red-200 text-red-600': link.href === '/dashboard' && pathname.startsWith('/dashboard')}

3. 针对多个固定路径激活同一个链接

如果需要让多个路径都激活某个链接(比如/dashboard和/dashboard/invoices都激活Home):

{'bg-red-200 text-red-600': link.href === '/dashboard' && ['/dashboard', '/dashboard/invoices'].includes(pathname)}

内容的提问来源于stack exchange,提问作者Abraham V G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:43:17