Запретить форме сбрасывать входные состояния в ReactJs - PullRequest
0 голосов
/ 25 апреля 2019

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

Я новичок в реагировании, и я действительно застрял в этом. Вот где я сейчас.

Фрагмент моего класса входа в систему:

class Login extends Component {
constructor(props) {
super(props);
this.state = {
  email: "",
  password: "",
  isLoggedIn: false,
  user: {}
 };
 this.onChange = this.onChange.bind(this);
 this.login = this.login.bind(this);
}

login(e) {
 e.preventDefault();
 this.props.login(this.state.email, this.state.password);
 }

onChange(e) {
this.setState({ [e.target.name]: e.target.value });
}

Пример моего ввода:

 <div className="form-group centerErrs">
                      <input
                        type="text"
                        value={this.state.email}
                        onChange={this.onChange}
                        className="form-control form-control-user"
                        placeholder="Username or Email Address"
                        autoComplete="off"
                        id="email-input"
                        name="email"
                      />
                      {this.props.errors ? (
                        <small className="form-text  red">
                          {this.props.errors.email}
                        </small>
                      ) : null}
                    </div>

Фрагмент моей функции входа в систему:

 var formData = new FormData();
 formData.append("email", email);
 formData.append("password", password);

   //posting to the api 
  .then(json => {
    if (json.data.success) {
      //handling the user data

      let appState = {
        isLoggedIn: true,
        user: userData
      };
      // save app state with user date in local storage
      localStorage["appState"] = JSON.stringify(appState);
      this.setState({
        isLoggedIn: appState.isLoggedIn,
        user: appState.user
      });

      //updated : here how i handle in fail case
      else {
      let appState = {
        isLoggedIn: false,
        errors: json.data
      };
      this.setState({
        isLoggedIn: appState.isLoggedIn,
        errors: appState.errors
      });
    }

Обновление: это мой конструктор родительского компонента:

    constructor(props) {
    super(props);
    this.state = {
    isLoggedIn: false,
    user: {},
    errors: {},
    };
   this.login = this.login.bind(this);
  }

Обновление контейнера входа в систему:

   const LoginContainer = () => (
   <div>
    {!this.state.isLoggedIn ? (
      <Login login={this.login} errors={this.state.errors} />
    ) : (
      <Redirect to="/" />
    )}
   </div>
 );

И рендер в родительском:

 <Route exact path="/(login)" component={LoginContainer} />

Я просто хочу сохранить состояние входных данных, если отправка формы не удалась.

Буду признателен за любую помощь и заранее благодарю.

1 Ответ

0 голосов
/ 26 апреля 2019

Пока LoginContainer является функцией, а не компонентом ReactJs, он будет воссоздавать весь пользовательский интерфейс, поэтому вы должны преобразовать его в React.Component, и логика проверки статуса аутентификации не должна быть внутри LoginContainer, поскольку маршрут Login не долженне существует, если пользователь вошел в систему

{this.state.loggedin?
 [Auth routes]:
 [<Route exact path="/(login)" component={LoginContainer} />...]

PS, предпочтительнее использовать глобальное хранилище для хранения состояния аутентификации, такого как избыточный или неустановленный, или любых других.

...