Se vuoi avere il concetto di "errori globali", puoi creare un errors
riduttore, che può ascoltare le azioni addError, removeError, ecc. Quindi, puoi collegarti al tuo albero di stato Redux su state.errors
e visualizzarli dove appropriato.
Ci sono molti modi in cui potresti avvicinarti a questo, ma l'idea generale è che gli errori / messaggi globali meriterebbero il loro riduttore per vivere completamente separati da <Clients />
/ <AppToolbar />
. Ovviamente, se uno di questi componenti necessita di accesso, errors
puoi trasmetterlo errors
a loro come supporto ovunque sia necessario.
Aggiornamento: esempio di codice
Ecco un esempio di come potrebbe apparire se dovessi passare gli "errori globali" errors
al tuo livello superiore <App />
e renderlo condizionatamente (se sono presenti errori). Uso di react-reduxconnect
per collegare il tuo <App />
componente ad alcuni dati.
// App.js
// Display "global errors" when they are present
function App({errors}) {
return (
<div>
{errors &&
<UserErrors errors={errors} />
}
<AppToolbar />
<Clients />
</div>
)
}
// Hook up App to be a container (react-redux)
export default connect(
state => ({
errors: state.errors,
})
)(App);
E per quanto riguarda il creatore dell'azione, invierà un errore di successo ( redux-thunk ) in base alla risposta
export function fetchSomeResources() {
return dispatch => {
// Async action is starting...
dispatch({type: FETCH_RESOURCES});
someHttpClient.get('/resources')
// Async action succeeded...
.then(res => {
dispatch({type: FETCH_RESOURCES_SUCCESS, data: res.body});
})
// Async action failed...
.catch(err => {
// Dispatch specific "some resources failed" if needed...
dispatch({type: FETCH_RESOURCES_FAIL});
// Dispatch the generic "global errors" action
// This is what makes its way into state.errors
dispatch({type: ADD_ERROR, error: err});
});
};
}
Mentre il tuo riduttore potrebbe semplicemente gestire una serie di errori, aggiungendo / rimuovendo le voci in modo appropriato.
function errors(state = [], action) {
switch (action.type) {
case ADD_ERROR:
return state.concat([action.error]);
case REMOVE_ERROR:
return state.filter((error, i) => i !== action.index);
default:
return state;
}
}