Как правильно перенаправить после успешного почтового запроса в React? - PullRequest
1 голос
/ 23 января 2020

Я новичок в React и создаю небольшой проект. Я использую сервер NodeJS, который отвечает на мой запрос, и я пытаюсь перенаправить пользователя после успешного входа в систему. Я отправляю действие и обновляю свое хранилище данных с помощью пользовательской информации, которая работает правильно. Но когда я пытаюсь перенаправить его, я либо не получаю ошибок и ничего не происходит, либо URL-адрес изменяется, но компонент не отображается. КСТАТИ в LoginForm. js Я пытался вернуть перенаправление после многих неудач, пытаясь добавить обратный вызов с объектом истории в мои действия. Вот мой код

Приложение. js

import React, { Component } from 'react';
import LoginPage from './login/LoginPage';
import LandingPage from './landingpage/landing.page';
import ProtectedRoute from './protected/ProtectedRoute';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import PageNotFound from './common/pageNotFound';


class App extends Component {

    render() {
        return (
            <Router >
                <Switch>
                    <Route path="/login" component={() => <LoginPage />} />
                    <ProtectedRoute path="/" component={LandingPage} />
                    <Route component={() => <PageNotFound />} />
                </Switch>
            </Router>
        )
    }
}

export default App;

LoginPage. js

import React, { Component } from 'react'
import LoginForm from './LoginForm';
import PropTypes from 'prop-types'
import { connect } from 'react-redux';
import { login } from '../../actions/authActions';
import { withRouter } from "react-router";


class LoginPage extends Component {

    render() {
        const { login, userLoading, history } = this.props;
        return (
            <div>
                <h1>Login in here</h1>
                <LoginForm login={login} isLoading={userLoading} history={history} />
            </div>
        )
    }
}

LoginPage.propTypes = {
    login: PropTypes.func.isRequired
}

function mapStateToProps(state) {
    return {
        userLoading: state.auth.isLoading
    }
}

export default connect(mapStateToProps, { login })(withRouter(LoginPage));

LoginForm. js

import React, { Component } from 'react'
import TextInput from '../common/TextInput';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { Redirect } from 'react-router-dom';
class LoginForm extends Component {

    constructor(props) {
        super(props);

        this.state = {
            email: '',
            password: '',
            redirect: false,
        }

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }


    handleChange(event) {
        this.setState({
            [event.target.name]: event.target.value
        })
    }

    handleSubmit(event) {
        event.preventDefault();
        this.setState({ error: null });
        this.props.login(this.state);
        this.setState({
            redirect: true
        })
    }

    render() {
        const { isLoading, isAuth } = this.props;
        const { redirect } = this.state;
        console.log(redirect, isAuth)

        if (redirect && isAuth) {
            return <Redirect to="/" />
        }
        else {
            return (
                <form onSubmit={this.handleSubmit}>
                    <TextInput type="email" name="email" label="Email" onchange={this.handleChange} />
                    <TextInput type="password" name="password" label="Password" onchange={this.handleChange} />
                    {isLoading && <p>We are loggin you in</p>}
                    <button disabled={isLoading} type="submit">Log in</button>
                </form>
            )
        }
    }
}

const mapStateToProps = (state) => {
    return {
        isAuth: state.auth.isAuthenticated
    }
}

LoginForm.propTypes = {
    login: PropTypes.func.isRequired
}

export default connect(mapStateToProps)(LoginForm);

authActions. js

import {
    LOGIN,
    LOGIN_SUCCESS,
    LOGIN_FAILED,
    USER_LOADING,
    USER_LOADED,
    AUTH_ERROR,
    REGISTER_SUCCESS,
    REGISTER_FAIL,
} from '../constants';

export function login(payload) {
    return dispatch => {
        dispatch({ type: USER_LOADING })
        setTimeout(function () {
            return fetch('http://localhost:3000/user/login', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(payload)
            }).then(
                (res) => {
                    dispatch({ type: LOGIN_SUCCESS })
                    return res.json();
                },
                (err) => dispatch({ type: LOGIN_FAILED })
            ).then((data) => {
                dispatch({
                    type: USER_LOADED,
                    payload: {
                        token: data.token,
                        userid: data.userID
                    }
                })
            });
        }, 1000);
    }
}

1 Ответ

0 голосов
/ 23 января 2020

Поскольку ваш LoginForm упакован с withRouter, вы можете использовать this.props.history.pushState('/next-route')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...