Определенно сохраняйте состояние своих редукторов!
Если вы сохранили последовательность действий вместо этого, вы никогда не сможете изменять свои действия в своем интерфейсе, не возившись внутри своей базы данных prod.
Пример: сохраняется состояние одного редуктора на сервер
Мы начнем с тремя дополнительными типами действий:
// actions: 'SAVE', 'SAVE_SUCCESS', 'SAVE_ERROR'
Я использую redux-thunk делать вызовы асинхронного сервера: это означает, что одно действие создатель может dispatch
дополнительных действий и проверить текущее состояние.
Создатель действия save
отправляет одно действие немедленно (чтобы вы могли показать счетчик или отключить кнопку «сохранить» в своем пользовательском интерфейсе). Затем он отправляет SAVE_SUCCESS
или SAVE_ERROR
действия после завершения запроса 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
};
(нотабене $.ajax
будет полностью работать на месте window.fetch
вещей, я просто предпочитаю, чтобы не загружать весь JQuery для одной функции!)
Редуктор просто отслеживает любой запрос выдающегося сервера.
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
}
}
Вы, вероятно, хотите сделать что-то с someResponseValue
что вернулся с сервера - может быть, это идентификатор вновь созданного объекта и т.д. и т.п.
Я надеюсь, что это помогает, это работает хорошо так далеко для меня!
Я думаю, что бэкэнд обычно довольно классический (нормальный БД), не отличающийся от других приложений CRUD. Однако вас могут заинтересовать такие подходы, как https://www.rethinkdb.com и http://www.confluent.io/blog/turning-the-database-inside-out-with-apache-samza/. –