反应路由器重定向与 history.push

react-router Redirect vs history.push

我正在阅读 react-router-redux examples,但我很困惑, 有什么区别:

import { Redirect } from 'react-router-dom'

...

<Redirect to='/login' /> 

import { push } from 'react-router-redux'

...

push('/login')

重定向

呈现 <Redirect> 将导航到新位置。新位置将 override the current location in the history stack, 像服务器端重定向 (HTTP 3xx) 一样。

历史

推送功能 Pushes a new entry onto the history stack

默认情况下,<Redirect> 组件会将当前位置替换为历史堆栈中的新位置,基本上用作服务器端重定向。

但它也可以与 属性 push 一起使用,在这种情况下,它将向历史堆栈中推送一个新条目,其工作方式与 history.push 相同。

事实上,<Redirect> 组件在幕后使用历史记录 pushreplace 方法。它只是一种更 React 的导航方式。

所以基本上你有两种导航方式:

  1. 在组件中使用history.pushhistory.replace(通常用withRouter HOC包裹,这样你就可以访问location 对象而无需将其从父级传递给子级。

  2. 根据

  3. 使用或不使用 push 属性 组件

在我使用 Redux 和 Typescript 的用例中,我注意到两者之间的区别。

这是它的简化版本:

export const LandingPage = () => {
  const { history } = useHistory();
    const { viewer } = useSelector(state => state.viewer);

    // Redirect method returns another component that handles the redirect
    // without mounting any of the route components
    if (!viewer?.token) {
        return <Redirect to="/signin" />;
    }

    // History.push method mounts the route component and runs 'onload' functions
    // Which can still throw an error if there's no viewer 
    // if (!viewer?.token) {
    //  history.push('/signin');
    //    // return history.push('/signin');  // throws Typescript error
    // }

    return (
        <Switch>
            <Route path="/dashboard" component={Dashboard}/>
            <Route path="/profile" component={Profile}/>
            <Route path="/" component={Home}/>
        </Switch>
    );
};

当使用 history.push() 方法时,return 语句中的 JSX 仍然可以挂载和 运行,而 returning 重定向会阻止您的其余部分代码。