问题是我在注销时无法设置令牌。 (console.log(action.payload)按预期打印'null'。)
这是一个减速器片段
case SET_TOKEN:
console.log('passing set token');
console.log(action.payload); <- prints null as expected
return { token: action.payload, errorMsg: '' };
减速器/ index.js
import { combineReducers } from 'redux';
import auth from './auth_reducer';
import menu from './menu_reducer';
export default combineReducers({
auth,
menu
});
这是屏幕
_doLogOut = () => {
// remove token, close modal, set all props null.
AsyncStorage.removeItem('token');
this.setState({ isModalVisible: false })
this.props.setToken(null);
console.log(this.props.token); <- here it prints 'randomTokenString' (not null)
if ( this.props.token == undefined || _.isNull(this.props.token) ) {
this.props.navigation.navigate('Auth');
}
}
function mapStateToProps({ auth: { token }, menu:{ username, bio }}) {
return {
token, username, bio
}
}
export default connect(mapStateToProps, actions)(MenuScreen);
这是行动部分
export const setToken = ( token ) => ({
type: SET_TOKEN,
payload: token
});
我刚刚发现如果我再次按下注销,它会导航到'Auth'。因此reducer实际上将props保存为null。因此,当我检查props.token是否为空时,道具尚未更改......任何人都可以解释这个???太奇怪了。
我想我应该为setToken()设置一个回调函数。
答案 0 :(得分:2)
Redux动作是异步的,在它被缩减之后,状态会改变并更新道具。因此,调用操作后导航的逻辑应放在componentWillReceiveProps
生命周期方法中,如下所示:
componentWillReceiveProps(newProps) {
const { navigation, token: newToken } = newProps;
const { token: oldToken } = this.props;
if (oldToken !== newToken && _.isNil(newToken)) {
navigation.navigate('Auth');
}
}
注意:lodash isNil
检查了undefined
和null