Zdecydowanie utrzymuj stan swoich reduktorów!
Jeśli zamiast tego zachowywałeś sekwencję działań, nigdy nie byłbyś w stanie modyfikować swoich działań w interfejsie użytkownika bez błądzenia w bazie danych prod.
Przykład: utrzymuje się stan jednego reduktora do serwera
Zaczniemy od trzech dodatkowych rodzajów działań:
// actions: 'SAVE', 'SAVE_SUCCESS', 'SAVE_ERROR'
używam redux-thunk zrobić wywołań serwera asynchroniczny: oznacza to, że jedna akcję Funkcja kreatora może dispatch
dodatkowe akcje i sprawdzić aktualny stan.
Kreator akcji natychmiast wywołuje jedną akcję (aby pokazać spinner lub wyłączyć przycisk "zapisz" w interfejsie użytkownika). Następnie wywołuje akcje SAVE_SUCCESS
lub SAVE_ERROR
po zakończeniu żądania POST.
var actionCreators = {
save:() => {
return (dispatch, getState) => {
var currentState = getState();
var interestingBits = extractInterestingBitsFromState(currentState);
dispatch({type: 'SAVE'});
window.fetch(someUrl, {
method: 'POST',
body: JSON.stringify(interestingBits)
})
.then(checkStatus) // from https://github.com/github/fetch#handling-http-error-statuses
.then((response) => response.json())
.then((json) => dispatch actionCreators.saveSuccess(json.someResponseValue))
.catch((error) =>
console.error(error)
dispatch actionCreators.saveError(error)
);
}
},
saveSuccess: (someResponseValue) => return {type: 'SAVE_SUCCESS', someResponseValue},
saveError: (error) => return {type: 'SAVE_ERROR', error},
// other real actions here
};
(nb $.ajax
byłoby całkowicie pracować w miejscu window.fetch
rzeczy, po prostu wolą nie załadować całość jQuery dla jednej funkcji!)
Reduktor tylko śledzi zaległych żądanie serwera.
function reducer(state, action) {
switch (action.type) {
case 'SAVE':
return Object.assign {}, state, {savePending: true, saveSucceeded: null, saveError: null}
break;
case 'SAVE_SUCCESS':
return Object.assign {}, state, {savePending: false, saveSucceeded: true, saveError: false}
break;
case 'SAVE_ERROR':
return Object.assign {}, state, {savePending: false, saveSucceeded: false, saveError: true}
break;
// real actions handled here
}
}
Prawdopodobnie będziesz chciał zrobić coś z someResponseValue
który wrócił z serwera - może to jest id nowo utworzonego podmiotu itp itd
Mam nadzieję, że to pomoże, to pracował ładnie tak daleko dla mnie!
Myślę, że backend jest zazwyczaj dość klasyczny (normalny DB), nie różni się od innych aplikacji CRUD. Jednak możesz być zainteresowany metodami takimi jak https://www.rethinkdb.com i http://www.confluent.io/blog/turning-the-database-inside-out-with-apache-samza/. –