Мои реквизиты не определены в методе componentDidMount в React

#javascript #reactjs #components #react-props #react-state

#javascript #reactjs #Компоненты #react-props #состояние реакции

Вопрос:

Почему мои значения в this.props и this.state не определены в моем componentDidMount методе? В других частях моего компонента класса я могу правильно обращаться к своим реквизитам и значениям состояния. Нужно ли мне передавать их куда-то отдельно или где я допустил какие-либо ошибки?

Там я не получаю значений:

 componentDidMount() {
    console.log(this.props.token)
    console.log(this.state.training.coach)
    // values are null and undefined.
    if (this.props.token == this.state.training.coach) {
        this.setState({
            iscreator: true
        });
        console.log(this.state.iscreator)
    } else {
        this.setState({
            iscreator: false
        });
    }
}
  

Там я получаю правильные значения при доступе this.props.token :

 handleDelete = (event) => {
    if (this.props.token !== null) {
        const trainingID = this.props.match.params.trainingID;
        axios.defaults.headers = {
                "Content-Type": "application/json",
                Authorization: this.props.token
            }
        axios.delete(`http://127.0.0.1:8000/api/${trainingID}/`)
        this.props.history.push('/');
        this.forceUpdate();
    } else {
    
    }
}
  

Ответ №1:

this.setState является асинхронным, что означает, что функция after не ожидает ее завершения, поэтому, если вы console.log свое состояние сразу после обновления, оно все еще может иметь старое значение.

Чтобы исправить это, вы можете проверить значение своего состояния в своем, render где оно в конечном итоге обновится, или вы можете запустить setState с обратным вызовом, подобным этому

 this.setState({iscreator: true}, () => console.log(this.state.iscreator) )
  

Это гарантирует запуск console.log только после setState завершения.

Комментарии:

1. да, но почему мои значения this.props.token и this.state.training.coach не определены?

2. Потому что для его обновления требуется всего лишь немного времени, и к тому времени, когда вы нажимаете на кнопку, которая вызывает handleDelete setState , она уже завершена.

3. Но когда я выводю эти значения выше setState, в них должно быть что-то. Почему они пустые? Или что я должен сделать, чтобы это сработало?