Состояние Redux не определено для функции, но не для render () - PullRequest
0 голосов
/ 19 ноября 2018

Я использую 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.log("TEST>>")
    console.log(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.log (this.props) возвращает неопределенное значение, если вызывается внутри конструктора (то же самое происходит, когда я console.log (props) . Но если я вызываю его внутри render () Я получаю реквизиты правильно (это означает, что я получаю правильный пользовательский объект с сервера разбора).

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

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

1 Ответ

0 голосов
/ 19 ноября 2018

Если console.log(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.

...