У меня есть компонент User, который рендерит компоненты UserAuth и UserProfile. Компонент User хранит access_token, который получает из UserAuth. Компонент UserProfile делает запрос к серверу (c access_token`ом, который он взял из User), и отображает информацию про пользователя.
Проблема в том что дочерний компонент маунтится раньше родителя, поэтому при запросе к серверу в componentDidMount() компонент UserProfile еще не имеет access_token.
Как мне вызвать функцию запроса к серверу, когда User обновит свой стейт?
// User
class User extends React.Component {
constructor(props) {
super(props);
this.state = {
access_token: '',
};
}
onUserChange = (new_user) => {
this.setState(new_user);
};
render() {
return <div className="User">
<UserProfile accessToken={this.state.access_token} />
<UserAuth userChange={this.onUserChange} />
</div>
}
}
// UserProfile
class UserProfile extends React.Component {
constructor(props) {
super(props);
this.state = {
userProfile: 'No access token',
}
}
// Где вызвать?
updateUserProfile = async (request_params) => {
//...Запрос к серверу...
this.setState({userProfile: response});
};
render() {
return <div className="UserProfile">
{this.state.userProfile}
</div>
}
};
UserPage, я предположу, что вы имели в виду UserProfile.
Если это так, то зачем вам вообще показывать профиль пользователя до того, как у вас есть access_token? Просто не показывайте его до того, как токен будет получен от сервера//....
{this.state.access_token &&<UserProfile accessToken={this.state.access_token} />}
//....
UserAuth? Не было бы проще вынести его логику в User? Или вообще объединить с UserProfile? Судить, что лучше, сложно из-за того, что не ясна ваша композиция.access_token где-то еще? Также если ваш компонент сделает анмаунт с запущенным асинхронным методом, в конце которого выполняется setState, у вас будет ошибка.
Я бы советовал забыть о подобном подходе в принципе. Изучите, что такое Redux и как вместе с ним писать асинхронные экшены (redux-saga, redux-thunk), либо используйте MobX - альтернатива Redux. Также может пригодиться Context, но он не такой гибкий, как остальные два, и не всегда применим.И как примечание: вместо конструктора можно написать просто
class User extends React.Component {
state = {
access_token: '',
}
//....
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости