reactjs - 如何在登录页面中隐藏标题组件

标签 reactjs react-hooks react-router react-router-dom

我的路由器中有一个全局 header 组件。但是我想在登录页面隐藏。

我试过像这样使用 window.location 解决方案。它有效但在登录页面导航到主页后不起作用。 (在我刷新页面之前它不会显示标题)

App.js


import React, { useState, useEffect } from "react";
import "./sass/app.scss";
import { db, auth } from "./configs/firebase-config";
import { MainContext } from "./hooks/Context";
import { eventbriteRoutes } from "./configs/routes";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import Header from "./components/Home/Header";

function App() {
  const [isAuth, setIsAuth] = useState(localStorage.getItem("isAuth"));

  const data = {
    isAuth,
    setIsAuth,
  };

  return (
    <>
      <MainContext.Provider value={data}>
        <Router>
          {window.location.pathname !== "/login" ? <Header /> : null}{" "}
          <Routes>
            {eventbriteRoutes.map((RouteItem, index) => (
              <Route
                exact
                key={index}
                path={RouteItem.path}
                element={RouteItem.element}
              />
            ))}
          </Routes>
        </Router>
      </MainContext.Provider>
    </>
  );
}

export default App;

最佳答案

创建一个布局路由,它呈现(有条件地)Header 组件和嵌套路由组件的 Outlet 组件。

例子:

import { Outlet, useLocation } from 'react-router-dom';

const Layout = ({ hideHeaderPaths = [] }) => {
  const { pathname } = useLocation();

  return (
    <>
      {!hideHeaderPaths.includes(pathname) && <Header />}
      <Outlet />
    </>
  );
}

...

function App() {
  const [isAuth, setIsAuth] = useState(localStorage.getItem("isAuth"));

  const data = {
    isAuth,
    setIsAuth,
  };

  return (
    <>
      <MainContext.Provider value={data}>
        <Router>
          <Routes>
            <Route element={<Layout hideHeaderPaths={["/login"]} />}>
              {eventbriteRoutes.map((RouteItem) => (
                <Route
                  key={RouteItem.path}
                  path={RouteItem.path}
                  element={RouteItem.element}
                />
              ))}
            </Route>
          </Routes>
        </Router>
      </MainContext.Provider>
    </>
  );
}

或者,如果只分离 "/login" 路由更容易,您可以创建一个无条件呈现 Header 组件的布局路由,并单独呈现登录路由。

例子:

import { Outlet } from 'react-router-dom';

const HeaderLayout = () => (
  <>
    <Header />
    <Outlet />
  </>
);

...

function App() {
  const [isAuth, setIsAuth] = useState(localStorage.getItem("isAuth"));

  const data = {
    isAuth,
    setIsAuth,
  };

  return (
    <>
      <MainContext.Provider value={data}>
        <Router>
          <Routes>
            <Route path="/login" element={<Login />} />
            <Route element={<HeaderLayout} />}>
              {eventbriteRoutes.map((RouteItem) => (
                <Route
                  key={RouteItem.path}
                  path={RouteItem.path}
                  element={RouteItem.element}
                />
              ))}
            </Route>
          </Routes>
        </Router>
      </MainContext.Provider>
    </>
  );
}

关于reactjs - 如何在登录页面中隐藏标题组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71549309/

相关文章:

reactjs - 使用 react router V4 以编程方式导航

javascript - 如何链接到包含从下拉列表中选择的项目的页面

reactjs - 如何在 React JS 中处理具有不同路由的组件

reactjs - NextJS 和 TailwindCSS 的字体问题(每次更改页面时字体大小都会改变)

javascript - 使用 Node 进行 Jest 测试 - 超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

reactjs - Jest - 在 useEffect Hook 中测试clearTimeout

reactjs - 如何通过 React-slick useRef hook 和 typescript 使用 AutoPlay 方法

nginx try_files 不起作用?

reactjs - 如何在渲染主页之前验证 token

debugging - 如何调试 webpack bundle 文件错误并在包含数千个的 bundle 中找到确切的错误。 ReactJs 中的行数