Состояние Redux undefined для функции, но не для render ()

Я использую redux, и я хочу отобразить свой основной ящик в зависимости от того, вошел ли пользователь в систему или нет. У меня есть класс init, который проверяет это и делает это соответственно.

Я отправлю код и объясню в конце:

Init.js

const mapStateToProps = (userReducer) => {
  return {
    ...userReducer,
  }
}
const mapDispatchToProps = (dispatch) => {
  return {
    dispatch,
    getCurrentUser: () => {
      dispatch(getCurrentUser())
    }
  }
}

class Init extends Component {
  constructor(props) {
    super(props);

    this.props.getCurrentUser()

    console.info("TEST>>")
    console.info(this.props)
}

  chooseInitialRoute() {
    const { navigation, user } = this.props;
    if (user) {
      navigation.dispatch(StackActions.reset(
        { index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'LoggedDrawer' })] }
      ))
    } else {
      navigation.dispatch(StackActions.reset(
        { index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'UnloggedDrawer' })] }
      ))
    }
  }

user_actions.js

export function getCurrentUser() {
  return (dispatch) => {
    Parse.User.currentAsync().then(function (user) {
      if (user) {
        dispatch({ type: 'GET_USER', payload: { user } })
      } else {
        dispatch({ type: 'GET_USER_REJECTED', payload: error })
      }
    })
  }
}

console.info (this.props) возвращает undefined, если вызывается внутри конструктора (то же самое происходит, когда я делаю console.info (реквизиты). Но если я вызываю его внутри render (), я получаю реквизиты правильно (это означает, что я получаю правильный объект пользователя с сервера синтаксического анализа).

Есть ли способ обновить реквизиты перед методом render ()? Я хочу получить "обновленный" реквизит на chooseInitialRoute ()

Заранее спасибо. Если потребуется больше кода, дайте мне знать.

Можете ли вы показать весь код init.js?

Vgoose 19.11.2018 02:42
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
1
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если console.info(props) не определен в конструкторе, это означает, что компонент позже получит реквизиты через componentWillReceiveProps, и я не знаю, где вы вызываете InitialRoute, но вы можете подумать о том, чтобы вместо этого поместить его в функцию жизненного цикла:

componentWillReceiveProps(props) {
    const { navigation, user } = props;
    if (user) {
      navigation.dispatch(StackActions.reset(
        { index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'LoggedDrawer' })] }
      ))
    } else {
      navigation.dispatch(StackActions.reset(
        { index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'UnloggedDrawer' })] }
      ))
    }
}

Обратите внимание: если ваши реквизиты не определены в конструкторе, то ваш компонент может отрисовываться несколько раз, прежде чем ваш компонент, наконец, получит реквизиты через componentWillReceiveProps.

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