绝对坚持你的减速器的状态!
如果您改为保留一系列操作,那么您将永远无法在前端修改您的操作,而无需在您的 prod 数据库中摆弄。
示例:将一个 reducer 的状态持久化到服务器
我们将从三种额外的操作类型开始:
// actions: 'SAVE', 'SAVE_SUCCESS', 'SAVE_ERROR'
我使用redux-thunk进行异步服务器调用:这意味着一个动作创建函数可以dispatch
额外动作并检查当前状态。
动作创建者save
立即调度一个动作(以便您可以显示微调器,或禁用 UI 中的“保存”按钮)。一旦 POST 请求完成,它就会分派SAVE_SUCCESS
一个动作。SAVE_ERROR
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
完全可以代替这些window.fetch
东西,我只是不想为一个函数加载整个 jQuery!)
reducer 只是跟踪任何未完成的服务器请求。
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
从服务器返回的内容做一些事情——也许它是一个新创建的实体的 id 等等。
我希望这会有所帮助,到目前为止对我来说效果很好!