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

ReactJS导航栏isActive异常:当前页标记方块重复显示

问题描述

开发ReactJS导航栏时,期望通过链接下方的旋转方块标记当前页面,但出现异常:方块始终保留在“Home”页下方,点击其他链接(如“About”)时,该链接下方会出现方块,但“Home”下方的方块不会消失。

现有代码

Navbar组件(.jsx)

import {Link, NavLink} from 'react-router-dom'

import './navbar.css'
import {links} from '../data'
import {GoThreeBars} from 'react-icons/go'
import Logo from '../images/example-logo.png'


const Navbar = () => {
  return (
    <nav>
        <div className='container nav__container'>
            <Link to='/' className='logo'>
                <img src={Logo} alt="Nav logo" />
            </Link>
            <ul className='nav__links'>
                {
                    links.map(({name, path}, index) => {
                        return (
                            <li>
                                <NavLink to={path} className={({isActive}) => isActive ? 'active-nav': ''} >{name}</NavLink>
                            </li>
                        )
                    })
                }
            </ul>
            <button className='nav__toggle-btn'>
                <GoThreeBars/>
            </button>
        </div>
    </nav>
  )
}

export default Navbar

样式代码(.css)

nav {
    height: 5rem;
    width: 100vw;
    background:var(--color-primary);
    display: grid;
    place-items: center;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 99;
}

.nav__toggle-btn {
    display: none;
}

.nav__container {
    height: 100%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    position: relative;
}

.logo {
    width: 5%;
}

.nav__links {
    display: flex;
    gap: 3.5rem;
    align-items: center;
}

.nav__links a {
    transition: var(--transition);
}

.nav__links a:hover {
    color: var(--color-secondary);
}

.active-nav {
    position: relative;
}

.active-nav::after {
    content: '';
    display: block;
    width: 1.2rem;
    height: 1.2rem;
    background: var(--color-primary);
    position: absolute;
    left: calc(50% - 0.6rem);
    transform: rotate(45deg);
    margin-top: 0.9rem;
}

问题原因

React Router的NavLink默认采用前缀匹配规则:当当前路径以to属性的路径开头时,isActive就会返回true。比如Home的路径是/,当跳转至/about时,/是/about的前缀,因此Home的isActive始终为true,导致active-nav类无法被移除。

解决方案

方案1:使用end属性实现完全匹配

在NavLink上添加end属性,仅当路径完全匹配时才激活状态:

<NavLink to={path} end className={({isActive}) => isActive ? 'active-nav': ''} >{name}</NavLink>

方案2:自定义isActive函数

如果需要更灵活的匹配逻辑,可以手动指定isActive函数,判断是否为完全匹配:

<NavLink 
  to={path} 
  className={({isActive}) => isActive ? 'active-nav': ''}
  isActive={(match, location) => {
    // 仅当路径完全匹配时返回true
    return match?.isExact;
  }}
>{name}</NavLink>

效果验证

修改后,点击其他页面链接时,Home的active-nav类会被移除,对应方块消失,仅当前页面的链接下方显示标记方块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:20