首先,所有相关代码(点击该文件的完整源代码的文件名)。
LoginView = class extends React.Component {
handleLogin = (email, password) => {
this.props.authenticationActionCreator.login(email, password);
};
componentWillMount () {
console.log('componentWillMount', 'this.props.isAuthenticated', this.props.isAuthenticated);
}
componentWillReceiveProps () {
console.log('componentWillReceiveProps', 'this.props.isAuthenticated', this.props.isAuthenticated);
}
render () {
let {
errorMessage,
isAuthenticating
} = this.props;
return <div>
<p>this.props.isAuthenticated: {this.props.isAuthenticated ? 'true' : 'false'}</p>
<button onClick={() => {
this.handleLogin('gajus@applaudience.com', 'nosyte');
}}>Login</button>
</div>;
}
};
authentication.js
(减速机)
if (action.type === 'AUTHENTICATION.LOGIN_SUCCESS') {
return initialState.merge({
isAuthenticated: true,
token: action.data.token,
user: action.data.user
});
}
authenticationActionCreator.js
authenticationActionCreator.loginSuccess = (token) => {
let decodedToken;
// @todo Handle failure to decode token.
decodedToken = jwtDecode(token);
localStorage.setItem('token', token);
return {
type: 'AUTHENTICATION.LOGIN_SUCCESS',
data: {
token,
user: decodedToken.user
}
};
};
流程很简单:
<button />
。{/ li>的authenticationActionCreator.login
醇>
console.log
输出为:
componentWillMount this.props.isAuthenticated true
action AUTHENTICATION.LOGIN_REQUEST @ 16:52:50.880
componentWillReceiveProps this.props.isAuthenticated true
componentWillReceiveProps this.props.isAuthenticated false
action AUTHENTICATION.LOGIN_SUCCESS @ 16:52:51.975
预期console.log
输出为:
componentWillMount this.props.isAuthenticated true
action AUTHENTICATION.LOGIN_REQUEST @ 16:52:50.880
componentWillReceiveProps this.props.isAuthenticated false
action AUTHENTICATION.LOGIN_SUCCESS @ 16:52:51.975
componentWillReceiveProps this.props.isAuthenticated true
问题是render
具有正确的状态(AUTHENTICATION.LOGIN_SUCCESS
之后的状态)和componentWillReceiveProps
具有旧状态(AUTHENTICATION.LOGIN_REQUEST
之后的状态)。
我是componentWillReceiveProps
与render
方法具有相同状态对象的最后一次调用。
这是:
答案 0 :(得分:3)
我花了所有这些调试跟踪/问题来记住componentWillReceiveProps
API是:
componentWillReceiveProps: function(nextProps) {}
换句话说,我的LoginView.js
示例应该是:
LoginView = class extends React.Component {
handleLogin = (email, password) => {
this.props.authenticationActionCreator.login(email, password);
};
componentWillReceiveProps (nextProps) {
console.log('componentWillReceiveProps', 'nextProps.isAuthenticated', nextProps.isAuthenticated);
}
render () {
let {
errorMessage,
isAuthenticating
} = this.props;
return <div>
<p>this.props.isAuthenticated: {this.props.isAuthenticated ? 'true' : 'false'}</p>
<button onClick={() => {
this.handleLogin('gajus@applaudience.com', 'nosyte');
}}>Login</button>
</div>;
}
};