我刚刚将我的应用程序从Reaction RoutDOM v5迁移到了v6.

我注意到一个奇怪的地方.

我的应用程序的 struct 是这样的,用户在项目和子项目之间移动时会停留在同一个URL上(example.com/projects).更新状态以在保持URL不变的同时更改项目.

因此,例如,用户可能从projectA到projectB再到projectC,所有这些都停留在/projects的同一条路由上.

在v6之前,Link组件处理得很好,包括正确处理浏览器的后退按钮.

但在v6中,Link组件似乎有效地将不同的状态合并在一起.如果用户从/home开始,点击projectA,然后点击projectB,然后返回按钮,他们将返回到/home而不是projectA.

这 destruct 了我的应用程序.

幸运的是,我做了一个测试,使用useNavigate()的行为与预期的一样(edit:also.它似乎目前在我的应用程序中运行,但Sandbox 显示它不工作100%).

在短期内,我用useNavigate通过onClick事件替换了Link组件.但我宁愿使用Link组件.

我做错什么了吗?这是一个bug吗?

代码(FWIW):

state: { project: model.id } 

<Link to={pathname} state={state}>
   {children}
</Link>

编辑:

正如我所建议的,我创建了3个Sandbox .

对于每个Sandbox:

  • 在主页上,导航到"项目A".
  • 在项目页面中,单击"转到A"/"转到B"几次
  • 单击浏览器后退按钮,直到它停止执行任何操作

预计

  • 浏览器"倒回"点击,带你回到项目,最终返回主页

究竟发生了什么

  • Sandbox 1作品
  • Sandbox 2只返回一次,然后不会再前进了
  • Sandbox 3将"倒带"通过项目,但不会回到主页

CodeSandbox 1(React 16/路由5.2/使用链接) Sandbox 1

CodeSandbox 2(React 18/路由6.22.3/使用链接)Sandbox 2

CodeSandbox 3(React 18/Router 6.22.3/使用useNavigate()代替链接)Sandbox 3

推荐答案

这有点令人困惑,我不能肯定地说why是这种情况,但似乎你的RRDv6Sandbox 中的链接是"重定向"而不是正常的推送.添加replace={false}到你的链接似乎产生预期和期望的行为.

另外请注意,在其他锚标记中嵌套锚标记是无效的.

import * as React from "react";
import { Route, Routes, Link, useLocation } from "react-router-dom";

import "./styles.css";

export default function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/projects" element={<Project />} />
      </Routes>
    </div>
  );
}
const Home = () => {
  const linkData = { pathname: "/projects", state: { project: "A" } };

  return (
    <div>
      <h1>Home</h1>

      <Link to={linkData.pathname} state={linkData.state} replace={false}>
        Project A
      </Link>
    </div>
  );
};
const Project = () => {
  const location = useLocation();
  const project = location.state?.project;

  const linkToA = { pathname: "/projects", state: { project: "A" } };
  const linkToB = { pathname: "/projects", state: { project: "B" } };

  const linkToUse = project === "A" ? linkToB : linkToA;

  return (
    <div>
      <h1>Project</h1>

      <h2>The project is {project}</h2>

      <Link to={linkToUse.pathname} state={linkToUse.state} replace={false}>
        Go to {project === "A" ? "B" : "A"}
      </Link>
    </div>
  );
};

Reactjs相关问答推荐

URL参数和React路由中的点

如何使用Reducer更新全局变量

使用Overpass API Endpoint计算 map 上的面积

有没有办法让两个状态在两次精准渲染中更新?

单击空白区域时,Reaction Multiple下拉组件不关闭

将动态元素中的输入数据传输到Reaction

TanStack/Reaction-Query在我的Vercel应用程序中不起作用

在Reaction中的第一次装载时,Use Effect返回空数组

列表中的每个子项都应该有一个唯一的keyprops .在react 应用程序中

Next.js `getLayout` 函数没有被调用

Symfony ux-react:使用react_component()时React组件不会渲染

如何到达类组件中的状态?

我如何在所有组件中使用 Chakra UI toast?

如何通过onpress on view in react native flatlist来降低和增加特定视图的高度?

react 事件顺序

如何将我的 ID 值传递给下一个组件?

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

将 Material UI 菜单渲染为

当上下文中的状态发生变化时,组件不会立即重新渲染

React-Native PDF 注释