this.setState отказывается запускаться - PullRequest
0 голосов
/ 30 ноября 2018

вот функция, которая запускается Submit:

  signup(user = {}) {
    this.setState({loading: true});
     axios.post( '/users.json', { user })
     .then(response => {
       this.props.propagateSignIn(response.data)
       this.setState({
         error: null,
         newUserEmail: this.email.current.value,
         signedUp: true,
         loading: false
       }, console.log(this.state.signedUp, this.state.loading));
       })
     .catch(error => {
       if( error.response ){
         this.setState({
           error: error.response.data,
           loading: false
         });
       }
     })
  }

Все работает, кроме этого:

   this.setState({
     error: null,
     newUserEmail: this.email.current.value,
     signedUp: true,
     loading: false
   }, console.log(this.state.signedUp, this.state.loading));

Если после него поставить console.log(), оно не запуститсяили.

Почему состояние не обновляется?

К вашему сведению функция, вызываемая в родительском компоненте при запуске this.props.propagateSignIn(response.data):

propagateSignIn(user) {
  this.getUser()
}

getUser(history = undefined) {
  axios.get("/users/get_current_user", {})
  .then(response => {
    if (response.data.user) {
      console.log('getUser:', response)
      this.setState({isReady: true,
                  ...response.data});
    } else {
      console.log("pas d'utilisateur connecté.")
      this.setState({
        user: null,
        isReady: true
      });
    }
  })
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

как сказал @sebink Когда вы создаете ссылку, убедитесь, что она ссылается на нужный компонент.В моем случае this.email.current.value, на самом деле относится к входу из другого компонента, так как я разделил свой компонент на несколько и забыл изменить некоторые ссылки.

0 голосов
/ 30 ноября 2018

ну, на самом деле вы можете попытаться обернуть console.log с помощью функции, потому что вам нужно предоставить обратный вызов, а не "значение".Таким образом, код может выглядеть следующим образом:

this.setState({
   error: null,
   newUserEmail: this.email.current.value,
   signedUp: true,
   loading: false
  }, () => console.log(this.state.signedUp, this.state.loading));
})

В целом размещение обратного вызова в setState не считается наилучшей практикой, и вы должны выполнять логику обратного вызова внутри методов жизненного цикла, например в componentDidUpdate()

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