Jeśli chcesz mieć co z "globalnymi błędami", możesz stworzyć reduktor errors
, który może nasłuchiwać działań addError, removeError, etc ... Następnie możesz podłączyć się do drzewa stanu Redux pod numerem state.errors
i wyświetlić je w odpowiednim miejscu.
Istnieje wiele sposobów, w jakie można się do tego podejść, ale ogólna idea mówi, że globalne błędy/komunikaty zasługują na to, aby ich własny reduktor żył całkowicie oddzielnie od <Clients />
/<AppToolbar />
. Oczywiście, jeśli któryś z tych składników wymaga dostępu do errors
, możesz przekazać im errors
jako prop, gdziekolwiek jest to potrzebne.
Aktualizacja: Kod Przykład
Oto jeden z przykładów, co to może wyglądać, jeśli były do przekazania „globalnej błędy” errors
na swoim najwyższym poziomie <App />
i warunkowo czynią go (jeśli istnieją błędy obecne). Używanie react-redux's connect
do podłączania komponentu <App />
do niektórych danych.
// 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);
I o ile twórca skarga dotyczy, to wysyłka (redux-thunk) brak sukcesu w zależności od odpowiedzi
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});
});
};
}
Podczas gdy reduktor może po prostu zarządzać szereg błędów, dodawanie/usuwanie wpisy odpowiednio.
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;
}
}
Otrzymujesz coraz więcej głosów, a to pewnie dlatego, że nie podajesz całego mnóstwa przykładowego kodu. Twoje pytanie i odpowiedzi, które otrzymasz, będą bardziej pomocne dla innych osób, jeśli problem zostanie zarysowany jaśniej. – acjay
Muszę się zgodzić z/@acjay, że tego pytania brakuje w kontekście. Odpowiedziałem poniżej (z przykładami kodu) na ogólne rozwiązanie, ale Twoje pytanie może zawierać pewne udoskonalenia. Wygląda na to, że możesz mieć kilka osobnych problemów. 1) Obsługa asynchronicznych akcji/błędów. 2) Rozdzielanie stanu odpowiednio w drzewie stanu redux. 3) Dostarczenie swoim komponentom danych, których potrzebują. – ErikTheDeveloper
@ErikTheDeveloper dzięki, twoja odpowiedź wygląda świetnie. Ale masz rację, zapomniałem wspomnieć o kontekście. Zmieniłem moje pytanie, używam este devstack i wygląda na to, że twoja odpowiedź nie ma tam zastosowania, tak jak jest ... –