我正在使用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()
上获取“更新”的道具先谢谢了。如果需要更多代码,请告诉我。
答案 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接收道具之前,组件可能会渲染多次。