私はこれがProtected
HOCを持ってはならないと言われるとき、ラップされたコンポーネントはまだレンダリングします。その目的は、ユーザーが認証されたときにのみWrappedComponent
をレンダリングすることです。それ以外の場合はAuthenticateComponent
をレンダリングする必要があります(通常はログインコンポーネント)。コンポーネントの還元状態がそれが
import React from "react"
const PROPTYPES = {
authenticated: React.PropTypes.bool.isRequired,
}
export default (WrappedComponent, AuthenticateComponent) => {
let Protected = (props) => (
props.authenticated
? <WrappedComponent {...props}/>
: <AuthenticateComponent {...props}/>
)
Protected.propTypes = PROPTYPES
return Protected
}
小道具は、接続されているReduxのコンテナコンポーネント
const AccountContainer = ({ children }) => (
<div>{children}</div>
)
const select = state => state.account
export default connect(select, { refreshUser, logout })(Protected(AccountContainer, LoginContainer))
から来た私のaccount
減速機は、次のようになります
function authenticated(state = false, action) {
switch (action.type) {
case actions.START_SIGNUP_SUCCESS:
case actions.LOGIN_SUCCESS:
return true
case actions.LOGIN_ERROR:
case actions.START_SIGNUP_ERROR:
case actions.LOGOUT_SUCCESS:
return false
default:
return state
}
}
...
export default combineReducers({
authenticated,
access_token,
loggingIn,
user,
error,
})
LOGOUT
アクションが設定されている場合ことを今起こりますstate.account.authenticated
プロパティはfalseに設定されていますが、まだWrappedComponent
がレンダリングされています。それはaccount
のさまざまな他のプロパティにアクセスし、それらもすべて既にクリアされており、コンポーネントはチェックしたり期待したりしません。 は、レンダリングされるとaccount
の状態がまだauthenticated
であることを前提としています。
どのような競合状態になるのだろうか?
私のレデューサーコードで私の質問を編集しました。お元気ですか? – philk