У меня есть компонент 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: '',
}
//....
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Нужно создать объект описывающий прямоугольник двумя точками(верхний левый и правый нижний угол)Далее нужно написать функцию, которая принимает...
Нужна помощь с реализацией такой вот задачи - функция должна принять массив функций и соединить их в цепочку наследования, после чего новый...
Доброе утроНадо срочно разобраться в коде, а JavaScript только начинаю изучать