Ich habe dieses Protected
HOC. Sein Zweck besteht darin, nur WrappedComponent
zu rendern, wenn der Benutzer authentifiziert ist. Ansonsten sollte die AuthenticateComponent
gerendert werden (normalerweise eine Login-Komponente).Wrapped-Komponente rendert immer noch, wenn Redux-Zustand sagt, sollte es nicht
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
}
Die Stützen für die Komponente von einer angeschlossenen redux Container Komponente
kamenconst AccountContainer = ({ children }) => (
<div>{children}</div>
)
const select = state => state.account
export default connect(select, { refreshUser, logout })(Protected(AccountContainer, LoginContainer))
meine account
Minderer wie folgt aussehen:
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,
})
Es kommt nun, dass, wenn die LOGOUT
Aktion gesetzt Die state.account.authenticated
-Eigenschaft wird auf "false" festgelegt, und dennoch wird WrappedComponent
weiterhin gerendert. Es greift auf verschiedene andere Eigenschaften von account
zu und sie wurden alle auch schon gelöscht, was die Komponente nicht prüft und erwartet. Die WrappedComponent
geht davon aus, dass der account
-Zustand immer noch authenticated
ist und daher gültig ist.
Ich frage mich, welche Art von Race-Bedingung könnte das sein?
Ich habe meine Frage mit meinem Reducer-Code bearbeitet. Sieht für dich ok aus? – philk