Предложения по реализации Redux с React.js

Это первый раз, когда я реализую сокращение для своего компонента, и я не могу с этим справиться, но я хотел бы знать, как это сделать.

Я уже добавил провайдера и хранилище в свой app.js, и я остановился, добавив редуктор, выборки и другие вещи для компонента react.js.

Это мой компонент React.js. Это простая панель входа, которая проверяет наличие логина и пароля в базе данных.

import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import Helmet from 'react-helmet';
import classNames from 'classnames';
import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';

// Import Material UI
import { withStyles } from '@material-ui/core/styles';
import NavigateNext from '@material-ui/icons/NavigateNext';
import NavigateBefore from '@material-ui/icons/NavigateBefore';

// Import Services
import AuthService from 'services/AuthService';

// Import Components
import Header from 'components/Header';
import Subheading from 'components/Subheading';
import Notification from 'components/Notification';
import Footer from 'components/Footer';

// Import Internationalize
import { FormattedMessage } from 'react-intl';
import messages from './messages';


class LoginPage extends Component {
  constructor() {
    super();

    this.setState = {
      login: '',
      password: '',
      isLoginExist: false,
      loginError: '',
      passwordError: ''
    };

    this.handleChangeEvent = this.handleChangeEvent.bind(this);
    this.handleFormSubmitLogin = this.handleFormSubmitLogin.bind(this);
    this.handleFormSubmit = this.handleFormSubmit.bind(this);

    this.Auth = new AuthService();
  }

  componentWillMount() {
    if (this.Auth.loggedIn()) this.props.history.replace('/dashboard');
  }

  handleChangeEvent(e) {
    this.setState({
      [e.target.name]: e.target.value,
      passwordError: '',
      loginError: ''
    });
  }

  handleFormSubmitLogin(e) {
    e.preventDefault();

    this.Auth.isLogin(this.props.login)
      .then((res) => {
        if (res.isLogin) {
          this.setState({
            isLoginExist: true,
            loginError: '',
            password: ''
          });
        } else {
          this.setState({
            login: '',
            loginError: <FormattedMessage {...messages.loginError} />
          });
        }
      })
      .catch(() => {
        this.setState({
          loginError: <FormattedMessage {...messages.loginError} />
        });
      });
  };

  handleFormBack = () => {
    this.setState({
      isLoginExist: false,
      login: '',
      password: '',
      passwordError: ''
    });
  };

  handleFormSubmit(e) {
    e.preventDefault();

    this.Auth.login(this.props.login, this.props.password)
      .then((res) => {
        if (res) {
          this.props.history.replace('/dashboard');
        } else {
          this.setState({
            passwordError: <FormattedMessage {...messages.passwordError} />,
            password: ''
          });
        }
      })
      .catch(() => {
        this.setState({
          passwordError: <FormattedMessage {...messages.loginError} />
        });
      });
  }

  render() {
    console.info(this.props);

    const { classes } = this.props;
    const { isLoginExist, loginError, passwordError } = this.props;
    return (
      <Fragment>
        <FormattedMessage {...messages.helmetLoginTitle}>
          {(title) => <Helmet title = {title} />}
        </FormattedMessage>

        <Header />

        <FormattedMessage {...messages.loginToTheSystem}>
          {(title) => <Subheading headerText = {title} />}
        </FormattedMessage>

        <div className = {classes.pageContainer}>
          <Notification />
          <div className = {classes.formContainer}>
            <form noValidate onSubmit = {this.handleFormSubmit}>
              {!isLoginExist ? (
                <Fragment>
                  <div className = {classes.textField}>
                    <FormattedMessage {...messages.numberId} />
                  </div>
                  {[
                    <Fragment key = {1}>
                      <FormattedMessage {...messages.inputNumber}>
                        {(placeholder) => (
                          <input
                            className = {classNames(classes.formItem, {
                              [classes.formError]: loginError
                            })}
                            placeholder = {placeholder}
                            name = "login"
                            type = "number"
                            onChange = {this.handleChangeEvent}
                            onKeyPress = {(ev) => {
                              if (ev.key === 'Enter') {
                                ev.preventDefault();
                                this.handleFormSubmitLogin(ev);
                              }
                            }}
                          />
                        )}
                      </FormattedMessage>
                      {loginError ? (
                        <div className = {classes.textError}>{loginError}</div>
                      ) : null}
                    </Fragment>
                  ]}
                  <button
                    type = "button"
                    className = {classes.formSubmit}
                    onClick = {this.handleFormSubmitLogin}
                  >
                    <span className = {classes.buttonText}>
                      <FormattedMessage {...messages.nextText} />
                    </span>
                    <NavigateNext />
                  </button>
                </Fragment>
              ) : (
                <Fragment>
                  <div className = {classes.textField}>
                    <FormattedMessage {...messages.accessCode} />
                  </div>
                  {[
                    <Fragment key = {2}>
                      <FormattedMessage {...messages.inputPassowrd}>
                        {(placeholder) => (
                          <input
                            className = {classNames(classes.formItem, {
                              [classes.formError]: passwordError
                            })}
                            placeholder = {placeholder}
                            name = "password"
                            type = "password"
                            onChange = {this.handleChangeEvent}
                            onKeyPress = {(ev) => {
                              if (ev.key === 'Enter') {
                                ev.preventDefault();
                                this.handleFormSubmit(ev);
                              }
                            }}
                          />
                        )}
                      </FormattedMessage>
                      {passwordError ? (
                        <div className = {classes.textError}>{passwordError}</div>
                      ) : null}
                    </Fragment>
                  ]}
                  <button className = {classes.formSubmit} type = "submit">
                    <span className = {classes.buttonText}>
                      <FormattedMessage {...messages.inputLogin} />
                    </span>
                  </button>
                  <button type = "button" onClick = {this.handleFormBack}>
                    <NavigateBefore />
                    <span className = {classes.buttonText}>
                      <FormattedMessage {...messages.backText} />
                    </span>
                  </button>
                </Fragment>
              )}
              <br />
            </form>
          </div>
          <Footer />
        </div>
      </Fragment>
    );
  }
}

LoginPage.propTypes = {
  classes: PropTypes.object.isRequired,
  history: PropTypes.object.isRequired,
  replace: PropTypes.string
};

const mapStateToProps = (state) => ({
  login: state.login,
  password: state.password,
  isLoginExist: state.isLoginExist,
  loginError: state.loginError,
  passwordError: state.passwordError
});

export default withStyles(styles)(
  withRouter(connect(mapStateToProps)(LoginPage))
);

у вас есть действия? вы сохраняете все состояние в отдельном компоненте. Преимущество mapStateToProps заключается в получении всего состояния приложения в одном компоненте, а не локальном состоянии.

andrewgi 03.03.2019 20:52

@andrewgi, у меня есть только то, что я показал на скриншоте. Мне нужен письменный код, чтобы понять этот пример.

ReactRouter4 03.03.2019 20:54

Я не собираюсь просто писать код. Вам нужны действия для отправки и сохранения данных в хранилище с помощью сокращения. redux.js.org/basics/basic-tutorial

andrewgi 03.03.2019 20:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
33
0

Другие вопросы по теме