Я пытаюсь выяснить, как перенаправить приложение реакции на соответствующую страницу после того, как оно было аутентифицировано через логин.
Вот мой файл App.js с маршрутизацией (без импорта):
ReactDOM.render((
<Provider store={store}>
<Router history={history}>
<Switch>
<PrivateRoute path="/test" component={Test} />
<Route path="/login" component={Login} />
<PrivateRoute path="/" render={() => <h1>Welcome</h1>} />
</Switch>
</Router>
</Provider>
), document.getElementById('root'));
Я использую компонент PrivateRoute для проверки подлинности частных маршрутов:
class PrivateRoute extends Route {
render() {
const { component: Component, isAuthenticated } = this.props;
let propsCopy = Object.assign({}, this.props);
delete propsCopy.component;
delete propsCopy.isAuthenticated;
return (
isAuthenticated
? <Component {...propsCopy} />
: <Redirect to={{
pathname: LOGIN_PATH,
state: { from: this.props.location }
}} />
);
}
}
/**
* Maps properties from Redux store to this component.
* @param {Object} state Redux object
* @return {Object} mapper properties
*/
function mapStateToProps(state) {
// pull out auth element from Redux store state
const { auth } = state;
// extract authenticated element from auth object
const { isAuthenticated } = auth;
return {
isAuthenticated
}
}
export default connect(mapStateToProps)(PrivateRoute);
Компонент My Login, на который перенаправляется (упрощено для примера:
class LoginForm extends Component {
constructor() {
super();
this.state = {
email: '',
password: '',
}
this.handleFormSubmit = this.handleFormSubmit.bind(this);
}
handleFormSubmit(event) {
//event.preventDefault();
const validation = this.validator.validate(this.state);
this.setState({ validation });
this.submitted = true;
if (validation.isValid) {
// submit form here
this.props.loginUser({
email: this.state.email,
password: this.state.password
});
}
}
render() {
return (
// My login FROM code here
)
}
}
function mapStateToProps(state) {
return {
isFetching: state.auth.isFetching,
loginError: state.auth.loginError,
isAuthenticated: state.auth.isAuthenticated
};
}
function mapDispatchToProps(dispatch, props, state) {
return {
loginUser: (credentials) => {
dispatch(loginUser(credentials));
},
};
}
export default connect(mapStateToProps, mapDispatchToProps)(LoginForm);
Сейчас он работает там, где он перенаправляет на компонент LoginForm
, если isAuthenticated
имеет значение false. Я могу отправить форму входа в свою службу входа в систему и получить ответ об успехе и установить isAuthenticated
.
У меня вопрос, как мне перенаправить на исходный маршрут? Где обычно выполняется перенаправление? Я предполагаю, что это никогда не делается в редукторе, поэтому это должно быть сделано в компоненте LoginForm
, верно?
Я знаю, что множество ресурсов обсуждают весь этот процесс входа в систему, но я не могу найти тот, который занимается этой проблемой (что меня удивило). Каждый перенаправляет на определенную страницу ('/', '/ home' и т. Д.), Но как мне перехватить и перенаправить на исходный маршрут.