7
まず、関連するすべてのコード(そのファイルの完全なソースコードのファイル名をクリックします)。componentWillReceiveProps状態が還元状態更新後のレンダリング状態と異なる
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('[email protected]', 'nosyte');
}}>Login</button>
</div>;
}
};
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
}
};
};
流れは単純である:
- ユーザーがページを開きます。
authenticationActionCreator.login
を呼び出す<button />
をクリックします。
console.log
出力である:
期待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
メソッドと同じ状態オブジェクトを持つことです。
はこれです:
- 私は私の期待が
falseです
は今まであなたをしましたどうして? 'componentWillReceiveProps'が' props'が更新される前に更新されたpropsと一緒に渡されるからですか?答えを残していただきありがとうございますbtw。私もAPIを最初にチェックしなかったし、何が起こっていたのか把握しようと時間を費やしていた。 – shriek