我正在开发一个ReactJS网站,它的样式是TailWind CSS,我在不同的组件中有一个导航栏和页脚.导航栏由三个菜单项组成:主页、关于和联系人.默认情况下,Home菜单项为红色,About和Contact项为黑色,表示我们在主页上.

Page load default

当"Contact"菜单项被点击时,它变成红色,Home和About变成黑色,"Contact"内容加载,表明我们在联系人页面上.

When contact is clicked

现在,我在"公司"部分的页脚中有一个名为"文化"的链接.点击"文化"应该导航到显示其自身内容的文化页面.但是,我也希望它将导航栏中的活动菜单项更改为"大约",以指示"文化"和"关于"之间的关系.

我正在寻找一种实现这一功能的方法.具体地说,我想知道如何在点击页脚中的"区域性"时更新导航栏中的活动菜单项,同时确保"区域性"仍然打开它自己的页面.

现在的问题是,如果我正在联系,而我点击页脚中的区域性,它会加载区域性页面,但导航指示器仍保持联系状态

enter image description here

任何实现这一点的帮助或代码示例都将不胜感激!

这是我的Navbar.jsx:

import React, {useState} from "react";
import {Link} from "react-router-dom";

const NavBar = () => {
  const [activeItem, setActiveItem] = useState("Home");

  const handleItemClick = (item) => {
    setActiveItem(item);
  };
  return (
    <nav className="bg-green-100 px-8 py-8 sm:pt-6 sm:pb-4 pb-5 mx-auto max-w-screen-xl lg:px-12 lg:py-12">
      <div>
        <ul className="flex space-x-12 justify-center">
          <li>
            <Link
              to="/"
              onClick={() => handleItemClick("Home")}
              className={`text-black ${
                activeItem === "Home" && "font-bold text-red-600"
              }`}>
              Home
            </Link>
          </li>
          <li>
            <Link
              to="/about"
              onClick={() => handleItemClick("About")}
              className={`text-black ${
                activeItem === "About" && "font-bold text-red-600"
              }`}>
              About
            </Link>
          </li>
          <li>
            <Link
              onClick={() => handleItemClick("Contact")}
              to="/contact"
              className={`text-black ${
                activeItem === "Contact" && "font-bold text-red-600"
              }`}>
              Contact
            </Link>
          </li>
        </ul>
      </div>
    </nav>
  );
};

export default NavBar;

这是我的footer.jsx:

import React from "react";
import {Link} from "react-router-dom";

const Footer = () => {
  return (
    <footer className="bg-gray-200 px-4 py-4 sm:pt-6 sm:pb-4 pb-5 mx-auto max-w-screen-xl lg:px-8 lg:py-6">
      <div className="flex justify-between">
        <div>
          <h3 className="font-semibold text-gray-700">Company</h3>
          <ul className="flex space-x-4">
            <li>
              <Link to="/culture" className="text-gray-500">
                Culture
              </Link>
            </li>
          </ul>
        </div>
      </div>
    </footer>
  );
};

export default Footer;

这是我的App.jsx:

import React from "react";
import {BrowserRouter, Route, Routes} from "react-router-dom";
import Navbar from "./components/Navbar";
import Footer from "./components/Footer";
import Home from "./page/Home";
import About from "./page/About";
import Culture from "./page/Culture";
import Contact from "./page/Contact";

const App = () => {
  return (
    <BrowserRouter>
      <Navbar />
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/contact" element={<Contact />} />
        <Route path="/culture" element={<Culture />} />
      </Routes>
      <Footer />
    </BrowserRouter>
  );
};

export default App;

推荐答案

您可以通过使用useLocation挂钩来执行此操作:

例如:

 const location = useLocation()
 const [activeItem, setActiveItem] = useState("Home");

 const sidebarActive = [
    {
      title: 'Home',
      route: '/home'
    },
    {
      title: 'contact',
      route: '/contact'
    },
    {
      title: 'About',
      route: '/about'
    },
    {
      title: 'About',
      route: '/culture'
    }
  ]
  
useEffect(() => {
    const headerText = sidebarActive.find((item) =>
      item.route.includes(location.pathname.split('/')[1])
    )
    console.log('in useEffect called', location.pathname, headerText)
    setActiveItem(headerText?.title)
  }, [location])

Reactjs相关问答推荐

我想将状态设置为true,直到每一张卡片都生成并在多姆中呈现

在一个地方调用函数会影响其他地方调用该函数

CreateBrowserRouter将props 传递给父组件以验证权限

为多租户SSO登录配置Azure AD应用程序

这两个子元素在Reaction Native中使用的有什么不同?

如何在我的 React 应用程序中仅显示我的 Register 组件

React 错误: 只能用作 元素的子元素,从不直接渲染.请将您的 包裹在

如何使用 App Router 和服务器组件在 Next.js 13 中实现分页

通过createRoot创建的React元素无法调用Provider值

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

Mui Datepicker 设置了错误的日期

Reactjs:MUI5:MobileDateTimePicker API:如何自定义日历中的文本

每次状态更改时都会提交react 表单

Firebase Storage: 对象不存在图片上传路径错误

文本的几个词具有线性渐变 colored颜色 - React native

使用 react pro 侧边栏展开折叠菜单

react-router v6 中的 BrowserRouter 和 createBrowserRouter 有什么区别?我可以在不使用数据 API 的情况下使用 createBrowserRouter 吗?

react-markdown 不渲染 Markdown

如何在 Cypress E2E 的站点上测试react 组件?

如何在 React 中制作动画?