如果使用 history.push 访问特定路由,React-Router v5 不会重定向

Posted

技术标签:

【中文标题】如果使用 history.push 访问特定路由,React-Router v5 不会重定向【英文标题】:React-Router v5 not redirecting if accessing specific route using history.push 【发布时间】:2020-08-23 16:03:30 【问题描述】:

在我的反应应用程序中,我有 /lead-manager 路线,/login 路线 还有/ 路由,后者是app.js 本身,我不希望任何人访问,如果有人只是去/ 路由,我希望他们重定向到/lead-manager 路由。 所以这就是我根据给出的解决方案所做的 here。

我的 app.jsx 部分

import 
  BrowserRouter as Switch,
  useHistory,
  Route,
  useLocation,
 from "react-router-dom";

const App = ( confirmAuthentication ) => 
  let location = useLocation();
  let history = useHistory();

  useEffect(() => 
    async function fetchIt() 
      if (localStorage.jwt !== undefined) 
        confirmAuthentication();
      
    
    fetchIt();
    if (location.pathname === "/") 
      history.push("lead-manager");
    
  , []);
 return (
    <div>
      <Switch>
        <Route exact path="/testing">
          <TestingComponent />
        </Route>
        <PrivateRoute path="/lead-manager" component=LeadApp />
        <Route exact path="/login">
          <LoginView />
        </Route>
      </Switch>
    </div>
  );

访问/ 路径时得到的输出是URL 中的/lead-manager。哪个是期望的,但该组件不会与/lead-manager 路由中定义的组件相应地呈现。它只是停留在/ 路由上,即使 URL 显示 /lead-manager

希望这很清楚

【问题讨论】:

你是如何定义使用过的路由器的,它是否在 App 组件中呈现? 我现在更新了我的查询@ShubhamKhatri 你的控制台有什么错误吗? @Panther 控制台没有错误 我认为你必须推 /lead-manager 而不是 lead-manager !! 【参考方案1】:

为了正确使用历史记录,您需要在层次结构中将应用程序组件包装起来的路由器。由于您在 App 组件中渲染路由器,因此它无法监听历史更改,因为 useHistory 提供的历史不引用路由器使用的历史,除非 App 组件被路由器包装。

不要在 App 组件内渲染路由器

此外,您已将 Router 渲染为 App 组件中的 Switch 组件,您必须改为从 react-router-dom 导入确切的 Switch 组件

检查下面的更新代码

import 


    BrowserRouter as Router,
      Switch
      useHistory,
      Route,
      useLocation,
     from "react-router-dom";

    const App = ( confirmAuthentication ) => 
      let location = useLocation();
      let history = useHistory();

      useEffect(() => 
        async function fetchIt() 
          if (localStorage.jwt !== undefined) 
            confirmAuthentication();
          
        
        fetchIt();
        if (location.pathname === "/") 
          history.push("lead-manager");
        
      , []);
     return (
        <div>
          <Switch>
            <Route exact path="/testing">
              <TestingComponent />
            </Route>
            <PrivateRoute path="/lead-manager" component=LeadApp />
            <Route exact path="/login">
              <LoginView />
            </Route>
          </Switch>
        </div>
      );
    

    export default (props) => <Router><App ...props/></Router>  

【讨论】:

@Subham Khatri。非常感谢有效。感谢清晰的解释R+

以上是关于如果使用 history.push 访问特定路由,React-Router v5 不会重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何在有状态组件的反应路由器 5.1.2 中使用 history.push('path')?

功能组件渲染中的 props.history.push 不会渲染组件

如何模拟与 history.push("/Initial"); 相同的行为?使用哈希路由器?

在 React 中,渲染重定向总是比使用 this.props.history.push 更好吗?

History.push 一个带有反应路由器的新标签的链接

React-router-dom:History.push 连接路径并且不会重新路由应用程序