Se vuoi avere il co ncept of "global errors", puoi creare un riduttore errors
, che può ascoltare le azioni addError, removeError, etc .... Quindi, è possibile collegarsi all'albero di stato di Redux allo state.errors
e visualizzarli laddove appropriato.
Ci sono molti modi per approcciarlo, ma l'idea generale è che gli errori/messaggi globali meriterebbero il proprio riduttore di vivere completamente separati da <Clients />
/<AppToolbar />
. Naturalmente se uno di questi componenti necessita dell'accesso a errors
, è possibile passare a errors
come oggetto di scena, laddove necessario.
Aggiornamento: Esempio di codice
Ecco un esempio di quello che potrebbe apparire come se si dovesse passare gli "errori globali" errors
nel vostro livello superiore <App />
e condizionalmente renderlo (se ci sono errori presenti). Utilizzando react-redux's connect
per collegare il tuo componente <App />
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 azione è interessato, sarebbe inviare (redux-thunk) mancato successo 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 riduttore potrebbe semplicemente gestire una serie di errori, aggiunta/rimozione 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;
}
}
Stai ottenendo voti ravvicinati, ed è probabilmente perché non stai fornendo un sacco di codice di esempio. La tua domanda e le risposte che otterrai saranno più utili ad altre persone se il problema è delineato in modo più chiaro. – acjay
Devo concordare con @acjay che questa domanda è carente nel contesto. Ho risposto di seguito (con esempi di codice) con una soluzione generale, ma la tua domanda potrebbe usare un po 'di raffinatezza. Sembra che tu possa avere alcuni problemi separati. 1) Gestione di azioni/errori asincroni. 2) Suddividere in modo appropriato lo stato dell'albero di Redux. 3) Ottenere i componenti i dati di cui hanno bisogno. – ErikTheDeveloper
@ErikTheDeveloper grazie, la tua risposta sembra grandiosa. Ma hai ragione, dimentico di menzionare il contesto. Ho modificato la mia domanda, sto usando este devstack e sembra che la tua risposta non sia applicabile lì così com'è ... –