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

React JS实现点击侧边栏项时分别修改图标与文字颜色

实现侧边栏菜单项点击高亮效果

要实现点击侧边栏菜单项时图标变橙色、文字变白的效果,只需两步:修改React组件添加选中状态,再补充对应的CSS样式。

步骤1:修改Navbar组件代码

添加状态跟踪选中的菜单项,同时修正原代码中侧边栏切换的逻辑错误:

import React, { useState } from "react";
import * as FaIcons from "react-icons/fa";
import * as AiIcons from "react-icons/ai";
import { Link } from "react-router-dom";
import { SidebarData } from "./SidebarData";
import "../App.css";
import { IconContext } from "react-icons";

function Navbar() {
  const [sidebar, setSidebar] = useState(true);
  // 新增状态:记录当前选中的菜单项索引
  const [activeItem, setActiveItem] = useState(0);

  // 修正侧边栏切换逻辑:取反当前状态
  const showSidebar = () => setSidebar(!sidebar);

  return (
    <>
      <IconContext.Provider value={{ color: "undefined" }}>
        <div className="navbar">
        </div>
        <nav className={sidebar ? "nav-menu active" : "nav-menu"}>
          <div className="app-logo">
            <img src="Src here" alt="logo"/>
          </div>
          <ul className="nav-menu-items" onClick={showSidebar}>
            {SidebarData.map((item, index) => {
              return (
                <li 
                  key={index} 
                  // 给选中的菜单项添加active类
                  className={`${item.cName} ${activeItem === index ? 'active' : ''}`}
                  // 点击菜单项时更新选中状态,阻止事件冒泡避免触发侧边栏切换
                  onClick={(e) => {
                    e.stopPropagation();
                    setActiveItem(index);
                  }}
                >
                  <Link to={item.path}>
                    {item.icon}
                    <span>{item.title}</span>
                  </Link>
                </li>
              );
            })}
          </ul>
        </nav>
      </IconContext.Provider>
    </>
  );
}

export default Navbar;

步骤2:添加CSS高亮样式

在你的CSS文件中新增以下样式,定义选中状态下的文字和图标颜色:

/* 选中菜单项的样式 */
.nav-text.active a {
  color: #ffffff; /* 文字变为白色 */
}

.nav-text.active .sidebar-icon {
  color: #ff7900; /* 图标变为橙色,可根据需求调整颜色值 */
}

可选:根据路由自动高亮(刷新页面保持状态)

如果希望页面刷新后仍保持当前路由对应的菜单项高亮,可以使用useLocation钩子监听路由变化:

import React, { useState, useEffect } from "react";
import * as FaIcons from "react-icons/fa";
import * as AiIcons from "react-icons/ai";
import { Link, useLocation } from "react-router-dom";
import { SidebarData } from "./SidebarData";
import "../App.css";
import { IconContext } from "react-icons";

function Navbar() {
  const [sidebar, setSidebar] = useState(true);
  const [activeItem, setActiveItem] = useState(0);
  const location = useLocation();

  const showSidebar = () => setSidebar(!sidebar);

  // 监听路由变化,自动匹配对应菜单项
  useEffect(() => {
    const activeIndex = SidebarData.findIndex(item => item.path === location.pathname);
    if (activeIndex !== -1) {
      setActiveItem(activeIndex);
    }
  }, [location.pathname]);

  return (
    <>
      <IconContext.Provider value={{ color: "undefined" }}>
        <div className="navbar">
        </div>
        <nav className={sidebar ? "nav-menu active" : "nav-menu"}>
          <div className="app-logo">
            <img src="Src here" alt="logo"/>
          </div>
          <ul className="nav-menu-items" onClick={showSidebar}>
            {SidebarData.map((item, index) => {
              return (
                <li 
                  key={index} 
                  className={`${item.cName} ${activeItem === index ? 'active' : ''}`}
                  onClick={(e) => {
                    e.stopPropagation();
                    setActiveItem(index);
                  }}
                >
                  <Link to={item.path}>
                    {item.icon}
                    <span>{item.title}</span>
                  </Link>
                </li>
              );
            })}
          </ul>
        </nav>
      </IconContext.Provider>
    </>
  );
}

export default Navbar;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:20:13