Сообщение об успехе продолжает срабатывать, несмотря на состояние ошибки в форме Semantic-React-UI

Я пытаюсь получить соответствующие сообщения для запуска в зависимости от состояния моего компонента формы для проверки переднего плана при отправке формы.

Одна из основных проверок, над которой я работаю, — это проверка того, существует ли электронное письмо, и если да, то следует продолжать видеть сообщение об ошибке. Если его нет в базе данных, должно сработать сообщение об успехе; И, конечно, если другие проверки пройдены!.

Я использую Semantic-UI React Forms, чтобы помочь с проверкой.

Это ключ и значения, которые я установил для объекта состояния в моем компоненте формы:

this.state = {
  fadeUp: 'fade up',
  duration: 500,
  username: '',
  password: '',
  usernameError: false,
  passwordError: false,
  formSuccess: false,
  formError: false,
  userNameDup: false,
}

Это мой обработчик отправки, который срабатывает при отправке:

handleSubmit(event) {
 event.preventDefault();
 var error = false

 var { username, password, userNameDup } = this.state

 var mailFormat = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/


if (!username.match(mailFormat)) {
  this.setState({ usernameError: true });
  error = true;
} else {
  this.setState({ usernameError: false });
}

if (password.length < 8) {
  this.setState({ passwordError: true });
  error = true;
} else {
  this.setState({ passwordError: false })
}

if (error) {
  this.setState({ formSuccess: false });
  return;
} else {
  this.setState({ formSuccess: true });
}

window.fetch('http://localhost:8016/users/registration', {
  method: 'POST',
  headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
  body: JSON.stringify({ username_email: username, password: password })
})
  .then(this.handleErrors)
  .then(function (response) {
    console.log(`response ${response}`)
    return response.json()
  }).then(function (data) {

    console.log('User created:', data)
  }).catch(function (error) {
    console.log(error);
  });

   setTimeout(() => { this.setState({ username: '', password: '' }) })

 }

handleErrors(response) {
  if (!response.ok) {
    if (response.status === 409) {
      console.log("response.status ", response.status);
      this.setState({
      userNameDup: true, formError: true, formSuccess:false
    });
    return;
  }
 } else {
  this.setState({
    userNameDup: false, formError:false
  })
 }
   return response;
 }

Это часть вида/разметки формы:

  {console.log("formSuccess 1", formSuccess)}

<Form size='large'
  onSubmit={this.handleSubmit}
  error={userNameDup || formError}>
  {console.log("formSuccess 2", formSuccess)}

  <Segment stacked>
    <Form.Input fluid icon='user'
      iconPosition='left'
      placeholder='E-mail address, e.g. [email protected]'
      name='username'
      value={username}
      onBlur={this.handleBlur}
      onChange={this.handleChange}
      error={usernameError}
    />

    <Transition visible={usernameError}
      animation='scale'
      duration={duration}>
      <Message error content='username_Email is in incorrect format e.g. [email protected]' />
    </Transition>

    <Form.Input fluid icon='lock'
      iconPosition='left'
      placeholder='Password'
      name='password'
      value={password}
      onBlur={this.handleBlur}
      onChange={this.handleChange}
      error={passwordError}
    />

    <Transition visible={passwordError}
      animation='scale'
      duration={duration}>
      <Message error content='Password needs to be greater than eight characters.' />
    </Transition>

    <Button color='teal'
      fluid size='large'
      disabled={!username || !password}>
      Register
      {/* {isLoggedIn ? `Register` : `Log-in`} */}
    </Button>

    <Transition visible={userNameDup || formError}
      unmountOnHide={true}
      animation='scale'
      duration={duration}>
      <Message
        error
        centered="true" header='This email exists.'
        content='Please re-enter another email address.' />
    </Transition>

    <Transition visible={formSuccess}
      unmountOnHide={true}
      animation='scale'
      duration={duration}>
      <Message
        success
        header='Your user registration was successful.'
        content='You may now log-in with the username you have chosen.' />
    </Transition>
  </Segment>
</Form>

Я предоставил gif, и вы можете видеть, что клавиша formSuccess на секунду переключается на true, что вызывает проблему. Но я думал, что мой handleError позаботится об этом при отправке?

снова обработать ошибку:

 handleErrors(response) {
    if (!response.ok) {
      if (response.status === 409) {
        console.log("response.status ", response.status);
        this.setState({
          userNameDup: true, formError: true, formSuccess:false /* why doesn't it stay falsey? */
        });
        return;
      }
    } else {
      this.setState({
        userNameDup: false, formError:false
      })
    }
    return response;
  }

Выдержка из отправки дескриптора:

window.fetch('http://localhost:8016/users/registration', {
  method: 'POST',
  headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
  body: JSON.stringify({ username_email: username, password: password })
})
  .then(this.handleErrors) /* Shouldn't this be where it changes to false? */
  .then(function (response) {
    console.log(`response ${response}`)
    return response.json()
  }).then(function (data) {

    console.log('User created:', data)
  }).catch(function (error) {
    console.log(error);
  });

Также не должно ли сообщение анимироваться каждый раз, когда вы нажимаете кнопку регистрации?

Пожалуйста помоги!!! И благодарю вас!


person Antonio Pavicevac-Ortiz    schedule 11.08.2019    source источник


Ответы (1)


if (error) {
    this.setState({ formSuccess: false });
    return;
} else {
    this.setState({ formSuccess: true });
}

Когда вы нажимаете кнопку «Отправить», начальное значение переменной error равно false, поэтому оно изменяет состояние formSuccess на true до тех пор, пока обещание не будет разрешено — когда вызывается handleErrors и снова изменяет его на false. Вы должны установить formSuccess в true только после того, как вы извлечете данные из базы данных, то есть внутри блока .then(), чтобы избежать проблем с асинхронностью.

Один из подходов к решению этой проблемы — отобразить сообщение об успешном завершении после того, как вы извлекли данные и подтвердили, что пользователь является новым, например:

handleErrors(response) {
  if (!response.ok) {
    if (response.status === 409) {
      console.log("response.status ", response.status);
      this.setState({
      userNameDup: true, formError: true, formSuccess:false
    });
    return;
  }
 } else {
  this.setState({
    userNameDup: false, formError:false, formSuccess: true
  })
 }
   return response;
 }

И тогда ваша проверка внешнего интерфейса ограничивается отображением только сообщения об ошибке.

if (!username.match(mailFormat)) {
  this.setState({ usernameError: true, formSuccess: false } });
} else {
  this.setState({ usernameError: false });
}

if (password.length < 8) {
  this.setState({ passwordError: true, formSuccess: false } });
} else {
  this.setState({ passwordError: false })
}
person Felipe    schedule 11.08.2019
comment
Эй, спасибо, мой друг! Не могли бы вы добавить, что вы имели в виду для блока .then()? И как мне справиться с handleErrors || if(error)? - person Antonio Pavicevac-Ortiz; 11.08.2019
comment
Спасибо за объяснение Фелипе! Теперь работает! - person Antonio Pavicevac-Ortiz; 12.08.2019