Redux状态在函数上未定义,但在render()上未定义

时间:2018-11-18 22:30:44

标签: react-native redux parse-server

我正在使用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 :(得分:0)

如果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接收道具之前,组件可能会渲染多次。