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

求助:如何在Next.js中实现侧边栏导航链接添加active类

Next.js侧边栏链接添加active类的正确实现

你当前的代码问题出在把className直接加在了Link组件上——Next.js的Link是路由跳转的包装组件,样式类应该应用到它内部的<a>标签上才会生效。另外我们还要确保路由切换时,active类能自动同步更新。

下面是修正后的完整代码:

import React, { useState } from 'react';
import { useRouter } from 'next/router';
import Link from 'next/link';
import sideData from './sideData';

const Sidebar = () => {
    const router = useRouter();
    const [side, setSide] = useState(false);

    const handleSide = () => {
        setSide(prev => !prev);
    };

    return (
        <>
            <div className={`sidebar ${side ? 'sidebar-active' : ''}`}>
                <ul>
                    {sideData.map((item) => {
                        // 用item.path作为key,比index更稳定
                        return (
                            <li key={item.path}>
                                <Link href={item.path}>
                                    {/* 把className移到a标签上,匹配路由时添加active类 */}
                                    <a className={router.pathname === item.path ? 'link link-active' : 'link'}>
                                        {item.title}
                                    </a>
                                </Link>
                            </li>
                        );
                    })}
                </ul>
            </div>
        </>
    );
};

export default Sidebar;

关键说明:

  • 样式类的正确位置:把className从Link组件移到内部的<a>标签,这样样式才能正常作用到链接元素上。
  • 路由匹配逻辑:通过router.pathname获取当前页面的路由路径,和侧边栏项的item.path对比,匹配时添加link-active类。
  • 响应式更新:useRouter提供的pathname是响应式的,当路由切换时,组件会自动重新渲染,更新对应的active类。
  • 优化key值:尽量避免用index作为列表项的key,改用每个item的唯一标识(比如item.path),这在列表项顺序变化时能避免不必要的组件重渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:54:07