我在App.jsx中使用了react-router,其中父组件是Main组件,具有以下路径

<Route path="/" element={<Main />}>
  <Route path="login" element={<Login />} />
  <Route path="signup" element={<SignUp />} />
</Route>

Main.jsx中,我在两个"Button"组件上使用了NavLink,分别用于LoginSignup的上述路由.按钮具有handleClick函数,该函数将一个名为"invisible"的类应用于下面提到的两个div,该函数使用条件呈现将Display属性设置为None,以隐藏div并仅呈现<Outlet />(LoginSignUp组件). 但是,当您try 使用浏览器的后退按钮返回到"/"路由时,div仍然不可见,需要重新加载页面才能显示.

App.jsx

import React, { useState } from "react";
import Main from "./Main";
import SignUp from "./SignUp";
import Login from "./Login";
import Home from "./Home";
import {  createBrowserRouter, createRoutesFromElements, Route, RouterProvider,} from "react-router-dom";

const router = createBrowserRouter(
  createRoutesFromElements(
    <Route path="/" element={<Main />}>
      <Route path="login" element={<Login />} />
      <Route path="signup" element={<SignUp />} />
    </Route>
  )
);

function App() {
  return <RouterProvider router={router} />;
}

export default App;

Main.jsx

import React, { useState } from "react";
import Button from "./Button";
import { NavLink, Outlet } from "react-router-dom";

function Main() {
  const [isVisible, setIsVisible] = useState(true);

  const handleClick = () => {
    setIsVisible(false);
  };

  return (
    <div className="main-div">
      <div className={`main-heading-div ${isVisible ? "" : "invisible"}`}>
        <p className="main-heading">
          Welcome to <span>The Book Keeper</span>
        </p>
        <p>Your Personal Library, Perfectly Organized</p>
      </div>

      <div className={`button-div ${isVisible ? "" : "invisible"}`}>
        <NavLink to="/login">
          <Button text="Log in" name="main-login" onClick={handleClick} />
        </NavLink>
        <NavLink to="/signup">
          <Button text="Sign Up" name="main-signup" onClick={handleClick} />
        </NavLink>
      </div>

      <Outlet />
    </div>
  );
}

export default Main;

当我试图解决前面的一个问题时,这个问题出现了,结果是当NavLink中的任何一个被点击时,<Outlet />Main组件的内容重叠.所以我试着用useState+css来解决这个问题,然后就得出了这个问题.

推荐答案

要在用户导航到"/"根路由时将isVisible状态重置回true,您可以使用useMatchuseEffect挂钩显式判断该匹配并重置状态.

示例:

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

function Main() {
  const [isVisible, setIsVisible] = useState(true);

  const homeMatch = useMatch("/");

  useEffect(() => {
    if (homeMatch) {
      setIsVisible(true);
    }
  }, [homeMatch, setIsVisible]);

  const handleClick = () => {
    setIsVisible(false);
  };

  ...
}

当然,如果您真正想要实现的只是将Main个组件的内容呈现在"/"上,那么将其重构为索引路由组件可能更明智.

示例:

const MainPage = () => (
  <>
    <div className="main-heading-div">
      <p className="main-heading">
        Welcome to <span>The Book Keeper</span>
      </p>
      <p>Your Personal Library, Perfectly Organized</p>
    </div>

    <div className="button-div">
      <NavLink to="/login">
        <Button text="Log in" name="main-login" />
      </NavLink>
      <NavLink to="/signup">
        <Button text="Sign Up" name="main-signup" />
      </NavLink>
    </div>
  </>
);
function Main() {
  return (
    <div className="main-div">
      <Outlet />
    </div>
  );
}
const router = createBrowserRouter(
  createRoutesFromElements(
    <Route path="/" element={<Main />}>
      <Route index element={<MainPage />} />
      <Route path="login" element={<Login />} />
      <Route path="signup" element={<SignUp />} />
    </Route>
  )
);

Javascript相关问答推荐

如何解决(不忽略)reaction详尽的linter规则,而不会在获取数据时导致无限的reender循环

Vega中的模运算符

TypScript界面中的Infer React子props

. NET中Unix时间转换为日期时间的奇怪行为

Phaser 3 console. log()特定游戏角色的瓷砖属性

我应该绑定不影响状态的函数吗?'

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

WebRTC关闭navigator. getUserMedia正确

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

Chart.js-显示值应该在其中的引用区域

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

如何将多维数组插入到另一个多维数组中?

JQuery Click事件不适用于动态创建的按钮

如何发送从REST Api收到的PNG数据响应

如何创建返回不带`new`关键字的实例的类

Webpack在导入前混淆文件名

为什么云存储中的文件不能公开使用?

使用父标签中的Find函数查找元素

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?