HOC Redux Dispatch вызывается после вызова дочернего компонента React componentDidMount

У меня есть компонент более высокого порядка (HOC), который используется для авторизации и обновления пользовательских сеансов.

Это RequireAuth HOC и его componentWillMount

componentWillMount() {
  console.info('HOC componentWillMount');
   // checks with authorizer that token is valid if not refresh token
    getUserFromLocalStorage()
      // update redux with new refresh token
      .then(data => {
        console.info('getUserFromLocalStorage')
        this.props.setUserToReduxState(data);
        console.info(
          'user sucess retrieved and user setUserToReduxState: ',
          data
        );
      })
      .catch(() => {
        logoutUserFromReduxState();
      });
  }
}

Это мой маршрутный звонок

<Route exact path = "/devices" component = {RequireAuth(Devices)} />

и вот мой componentDidMount для компонента Devices

componentDidMount() {
  console.info('componentDidMount')
  // calls api
  this.loadData();
}

Этот дочерний компонент вызывает API, которому требуется токен. Однако, когда токен обновляется, он обновляется перед вызовом API в компоненте устройств, но действие redux, которое возвращается из обещания '.then' в HOC, не обновляет состояние redux перед вызовом api в дочернем компоненте .

Есть ли способ убедиться, что токен находится в состоянии обновления / сокращения до того, как ребенок попытается вызвать API?

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

azium 29.03.2018 23:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
465
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы можете добавить условие внутри вашего HOC, чтобы не отображать ваш «расширенный компонент» - в вашем случае Devices до тех пор, пока setUserToReduxState не будет разрешен с помощью токена пользователя. только после установки токена пользователя ваш компонент Devices отобразит метод loadDate.

например - вы можете сопоставить состояние вашего пользователя с переменной. Если пользователь не существует - не визуализируйте компонент, который вы передаете в HOC.

Обновлено: (добавлен фрагмент кода)

// In your render method get the current user from redux - see  mapStateToProps functoion
render(){
    const { user } = this.props;
    return (
        return (
        <div>
            {
              user && user.token
              ? <Component {...this.props} />
              : null // Here you can replace this with spinner if you want..
            }
        </div>
      )
    )
}


const mapStateToProps = (state) => ({
    user: state.auth.user
})

Теперь, когда пользователь настроен, ваш компонент будет повторно отрисован, а компонент Devices вызовет метод loadData, когда токен будет установлен точно.

Это хороший ответ. Вы могли бы дать отличный ответ, включив пример кода на основе кода OPs

azium 30.03.2018 00:05

@tsahnar спасибо за это. Можете ли вы хоть как-то доказать пример? Спасибо

dankthreads 30.03.2018 05:59

Я понимаю, в этом есть большой смысл. После аутентификации у них появляется токен, который обновляется каждый час, а код меняется. Есть ли способ убедиться, что новый обновленный токен используется для вызова API? В настоящий момент, если токен обновляется, redux не будет обновлять состояние до срабатывания componentDidMount в дочернем компоненте. Приветствую @tsahnar

dankthreads 30.03.2018 10:38

Другие вопросы по теме