React. Ожидание ответа от сервера

144
07 ноября 2021, 06:10

У меня есть компонент 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>
  }
};
Answer 1
  1. Не понятно, что такое UserPage, я предположу, что вы имели в виду UserProfile. Если это так, то зачем вам вообще показывать профиль пользователя до того, как у вас есть access_token? Просто не показывайте его до того, как токен будет получен от сервера
//....
{this.state.access_token &&<UserProfile accessToken={this.state.access_token} />}
//....
  1. Зачем вам вообще UserAuth? Не было бы проще вынести его логику в User? Или вообще объединить с UserProfile? Судить, что лучше, сложно из-за того, что не ясна ваша композиция.
  2. Ваш код не следует ни одному паттерну управления состоянием приложения в React, вся логика данных у вас находится в компонентах и нету глобального хранилища. А что, если вы захотите использовать access_token где-то еще? Также если ваш компонент сделает анмаунт с запущенным асинхронным методом, в конце которого выполняется setState, у вас будет ошибка. Я бы советовал забыть о подобном подходе в принципе. Изучите, что такое Redux и как вместе с ним писать асинхронные экшены (redux-saga, redux-thunk), либо используйте MobX - альтернатива Redux. Также может пригодиться Context, но он не такой гибкий, как остальные два, и не всегда применим.

И как примечание: вместо конструктора можно написать просто

class User extends React.Component {
 state = {
   access_token: '',
 }
//....
}
READ ALSO
Как получить переменную в объекте

Как получить переменную в объекте

Нужно создать объект описывающий прямоугольник двумя точками(верхний левый и правый нижний угол)Далее нужно написать функцию, которая принимает...

307
Цепочка наследования

Цепочка наследования

Нужна помощь с реализацией такой вот задачи - функция должна принять массив функций и соединить их в цепочку наследования, после чего новый...

246
Что означает запись, которая напоминает массив, но используется на месте имени константы

Что означает запись, которая напоминает массив, но используется на месте имени константы

Доброе утроНадо срочно разобраться в коде, а JavaScript только начинаю изучать

166