Перенаправление реакции после входа в систему

#reactjs #redirect #react-router

#reactjs #перенаправление #react-маршрутизатор

Вопрос:

У меня есть ajax-логин в приложении React. Он обрабатывает компонент LoginForm. Приложение также использует React router После входа в ajax я хотел бы сделать что-то вроде перенаправления на другую страницу React. Я не знаю, как правильно перенаправить со страницы входа на домашнюю страницу после успешного входа. Кто-нибудь может мне помочь, пожалуйста? Я использую стиль класса для создания компонентов.

Это код из компонента LoginForm:

     sendData(e)
    {
        e.preventDefault();
        this.setState({'errors': [], 'success': []});

        let formData = new FormData();
        formData.set('name', this.state.name);
        formData.set('password', this.state.password);

        axios({
            method: 'POST',
            //url: 'http://localhost:8000/login'
            data: formData,
            headers: {
                'Content-Type': 'text/html',
                'X-Requested-With': 'XMLHttpRequest',
            }
        })
            .then(response => {
               // Here should be the redirect to another React page
            })
            .catch(response => {
                this.setState({errors: ['Login fails. Try it again later please.']})
            });
    }
  

Маршрутизатор React выглядит следующим образом

 <div className="collapse navbar-collapse" id="navbarSupportedContent">
    <ul className="navbar-nav mr-auto">
        <li className="nav-item">
            <NavLink to="/" className="nav-link">Home</NavLink>
        </li>
        <li className="nav-item">
            <NavLink to="/login" className="nav-link">Login</NavLink>
        </li>
        <li className="nav-item">
            <NavLink to="/about" className="nav-link">About</NavLink>
        </li>
    </ul>
</div>
<div className="container-fluid">
    <div>
        <Switch>
            <Route path="/" exact>
                <Home />
            </Route>
            <Route path="/login">
                <Login />
            </Route>
            <Route path="/about" component={About}/>
        </Switch>
    </div>
</div>
  

Ответ №1:

Если вы используете функциональные компоненты, вы можете использовать useHistory хук, предоставляемый react-router-dom .

При успешном входе перенаправьте на домашнюю страницу, как показано ниже:

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

const Login = () => {
   const routerHistory = useHistory();
   ...

   const sendData = (e) => {
      ...
      .then(response => {
         // Here should be the redirect to another React page
         routerHistory.push('/');
      }) 
      ...
   }
   
   ...
}
  

Вы также могли бы использовать history prop, который является одним из prop, переданных с маршрутизатора React. Это также будет работать в компонентах на основе классов.

 class Login {
     ...

     sendData(e) {
        ...
        .then(response => {
           // Here should be the redirect to another React page
           this.props.history.push('/');
        })
        ...
     } 

    ...
}
  

Если Login компоненту не передаются реквизиты маршрутизатора из-за иерархии компонентов в вашем приложении, то вы можете использовать withRouter компонент более высокого порядка для получения доступа к history объекту.

 import { withRouter } from "react-router";

class Login {
   ...
}

export default withRouter(Login);
  

Подробности см.:

Комментарии:

1. Я использую компоненты класса. Можете ли вы показать решение для классов?

2. Я получаю историю ошибок, которая не определена. В LoginForm я создаю import { History } from "react-router-dom" но я не уверен, как получить историю для компонента. Извините, я начинаю с React.