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

React导航点击激活所有按钮 如何实现仅激活点击项且默认激活首项

问题根因

  • 你的代码中使用了全局的布尔类型状态isActive控制所有导航链接的激活状态,所有链接共用同一个状态判断规则,所以状态切换时所有链接都会同步添加/移除激活类
  • 没有存储当前激活导航项的唯一标识,无法区分哪个链接应该被激活
  • 状态初始值没有对应第一个导航项,无法实现默认第一个激活的需求

调整方案

将状态修改为存储当前激活导航项的索引(或路径、标题等唯一标识),初始值设为0对应第一个导航项,点击时仅更新为当前点击项的索引,激活类只匹配索引一致的链接。

修改后的完整代码如下:

import React, { useState } from "react";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; // 原代码漏了该导入,运行报错可补充
import styles from "./index.module.css";
import getNavigation from "../../utils/navigation";
import { Link } from "react-router-dom";
import logo from "../../images/europa-logo.png";

const Header = () => {
  const links = getNavigation();
  // 状态改为存激活项的索引,初始值0对应第一个导航项默认激活
  const [activeIndex, setActiveIndex] = useState(0);

  // 接收点击项的索引更新状态
  const toggleClass = (index) => {
    setActiveIndex(index);
  };

  return (
    <div>
      <nav className={styles.topnav}>
        <div className={styles.pageWrapper}>
          <img src={logo} alt="Logo" />

          <ul>
            {links.map((l, i) => (
              <li key={i}>
                <Link
                  // 只有当前遍历的索引和激活索引一致才加激活类
                  className={activeIndex === i ? "btn-active" : null}
                  // 点击时传入当前索引
                  onClick={() => toggleClass(i)}
                  to={l.link}
                  value={l.title}
                >
                  {l.title}
                </Link>
              </li>
            ))}

            <li>
              <div className={styles.social}>
                <a href="https://facebook.com">
                  <FontAwesomeIcon
                    size="2x"
                    icon={["fab", "facebook-square"]}
                  />
                </a>

                <a href="mailto:someone@mail.com">
                  <FontAwesomeIcon size="2x" icon="envelope" />
                </a>
              </div>
            </li>
          </ul>
        </div>
      </nav>
    </div>
  );
};

export default Header;

可选优化

如果你使用的是react-router-dom v6,可以直接用自带的NavLink组件替换Link,它会自动根据当前页面路径匹配激活状态,不需要手动维护状态,刷新页面后激活状态也能自动和当前路由对齐。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:18:02