当前位置: 首页 > 知识库问答 >
问题:

React router v4使用声明式重定向而不呈现当前组件

汪和悌
2023-03-14

我正在使用类似的代码在用户登录后在我的应用程序中重定向。代码如下所示:

import React, { Component } from 'react'
import { Redirect } from 'react-router'

export default class LoginForm extends Component {
  constructor () {
    super();
    this.state = {
      fireRedirect: false
    }
  }

  submitForm = (e) => {
    e.preventDefault()
    //if login success
    this.setState({ fireRedirect: true })
  }

  render () {
    const { from } = this.props.location.state || '/'
    const { fireRedirect } = this.state

    return (
      <div>
        <form onSubmit={this.submitForm}>
          <button type="submit">Submit</button>
        </form>
        {fireRedirect && (
          <Redirect to={from || '/home'}/>
        )}
      </div>
    )

  }
}

触发成功登录时正常工作。但存在这样的情况,即登录的用户进入登录页面并应被自动重定向到主页页面(或任何其他页面)。

如何使用重定向组件而不呈现当前组件,以及(据我所知)不将命令推送到历史记录(例如,componentWillMount)中?

共有2个答案

鞠凌龙
2023-03-14

这里有另一个解决方案,它根本不接触React的东西。例如,如果你需要在redux-saga内部导航。

有文件history.js:

import {createBrowserHistory} from 'history';
export default createBrowserHistory();

在您定义路由的地方,不要使用浏览器路由器,而只使用常规

import history from 'utils/history';

...

<Router history={history}>
  <Route path="/" component={App}/>
</Router>

就这样了。现在,您可以使用相同的历史导入和推送新路由。

在应用程序的任何部分:

import history from 'utils/history';
history.push('/foo');

在传奇故事中:

import {call} from 'redux-saga/effects';
import history from 'utils/history';

 ... 

history.push('/foo');
yield call(history.push, '/foo');

史谦
2023-03-14

解决方案1

您可以使用路由器HOC通过道具访问历史记录。

使用路由器导入。

import {
  withRouter
} from 'react-router-dom';

然后用HOC包裹。

// Example code
export default withRouter(connect(...))(Component)

现在您可以访问this.props.history。例如,使用它与组件didMount()

componentDidMount() {
  const { history } = this.props;

  if (this.props.authenticated) {
    history.push('/private-route');
  }
}

解决方案2好多了

下面是关于反应训练的例子。

这对你来说很合适。

但是您只需要创建LoginRoad来处理您描述的问题。

const LoginRoute = ({ component: Component, ...rest }) => (
  <Route
    {...rest} render={props => (
    fakeAuth.isAuthenticated ? (
        <Redirect to={{
          pathname: '/private-route',
          state: { from: props.location }
        }} />
      ) : (
        <Component {...props} />
      )
  )} />
);

和内部

<Route path="/login" component={Login}/>

具有

<LoginRoute path="/login" component={Login}/>

现在,每当有人试图以身份验证用户身份访问/login路由时,他将被重定向/private route。这是一个更好的解决方案,因为如果不满足条件,它不会装载您的LoginComponent

 类似资料:
  • 我试图通过“state”属性在重定向组件内部传递一条错误消息,从而重定向到一个错误页面。 但是每当我添加“state”属性时,与重定向路由相关联的组件(ErrorPg)就不会呈现(并且我得到一个空白页面),即使URL被正确地更新了。 我试图遵循第一种解决方案,以供参考。 以下是相关文件。非常感谢。 错误处理程序。tsx(包含重定向组件的文件) Router.tsx(我在/error路径中调用渲染方

  • 我意识到以前有人问过我这个问题,请容忍我,因为我还在学习这个问题。我想我已经尝试了所有的解决方案,但是没有运气。 问题是:当重定向到时,它没有呈现预期的组件() 我已经实现了一个,如下所示; privaterout.js 这就是我使用它的地方; index.js 在这个问题中要补充几点: 我确认重定向确实发生在(我通过将

  • 我有困难建立一个有3个类的结构。我不确定包含/转发声明。 下面的代码一直在编译,直到我在inclino.h中添加名称空间和枚举。我从Inclinomeasure.h收到“Inclino尚未声明”。 倾斜度。h 倾斜度 倾角读数.h 结构正确吗?如何访问其他类中的枚举? 提前道谢。 编辑:我修复了名称空间的问题,把它放在一个新的文件,包括由3类。但我似乎误用了include/forward声明。

  • 到目前为止,我遇到的所有示例都将用户重定向到页面,如果捕获到: 这就引发了一个问题--为什么要使用?

  • 所以我对Qt和C++都是新手,但我想弄清楚下面的代码是怎么回事。 我有一个头文件和源文件charinfowindow。在我拥有的源文件中: 在头文件中 我试着找出这些代码在网上做什么,但我只是在找关于如何做的资源。 如果有人能告诉我,首先,这些代码是做什么的,其次,他们为什么这样做。不胜感激。 谢谢

  • 我想从我的Spring类中配置“事务性”bean,而不是用注释类实现本身。 问题:是否可以从类声明的事务性,或者考虑到上面的约束,是否有其他选择?