javascript 从另一个BrowserRouter导航到某个基本BrowserRouter的基本路由,显示“警告:已超过最大更新深度,”

iswrvxsc  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(91)

当从一个BrowserRouter导航到其他BrowserRouter时,它显示“超过最大更新深度”。
警告:已超过最大更新深度。当>组件在useEffect中调用setState时,可能会发生这种情况,但useEffect要么>没有依赖数组,要么依赖关系之一在>每次渲染时都会更改。
应用程序代码

export const App = () => {
  return (
    <ErrorBoundary>
      <BrowserRouter basename="">
        <Navigate to="base-route" />
      </BrowserRouter>
      <BrowserRouter basename="base-route">
        <Router />
      </BrowserRouter>
    </ErrorBoundary>
  );
};

laik7k3q

laik7k3q1#

第一个路由器无条件地渲染Navigate组件,该组件创建渲染循环。在路线上渲染Navigate,例如"/",所以只有当"/"路径匹配时才被***有条件地***调用。
示例:

export const App = () => {
  return (
    <ErrorBoundary>
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<Navigate to="base-route" replace />} />
        </Routes>
      </BrowserRouter>
      <BrowserRouter basename="base-route">
        <Router />
      </BrowserRouter>
    </ErrorBoundary>
  );
};

请注意,通过这样做,具有"/base-route"路径的第二个路由器将不知道由第一个路由器调度和处理的导航操作,并且不会重新呈现以显示正确的路由内容。您可以在客户端通过一个小的重构来解决这个问题,以额外触发页面重新加载。
示例:

import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";

const BaseRedirect = ({ to, replace }) => {
  useEffect(() => {
    window.location.reload();
  }, []);

  return <Navigate to={to} replace={replace} />;
};

export const App = () => {
  return (
    <ErrorBoundary>
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<BaseRedirect to="base-route" replace />} />
        </Routes>
      </BrowserRouter>
      <BrowserRouter basename="base-route">
        <Router />
      </BrowserRouter>
    </ErrorBoundary>
  );
};

如果您希望避免这种客户端页面重新加载,那么您应该将服务器配置为对第一个URL返回301响应以重定向客户端,例如浏览器到第二个URL。

相关问题