gab*_*ssi 18 javascript flux reactjs redux
我一直在使用React + Flux应用程序中的乐观更新,并看到两件事:
因此,我致力于此并创建一个ActionStore来管理由组件触发的操作的状态.这是源代码,这是一个现场演示.
它的工作方式或多或少是这样的:
我这样做主要是为了将"实体"的状态与动作的状态分开,但允许具有相同有效负载的重新触发操作(如果服务器临时关闭或者如果我们收到500响应状态,这可能很有用用户松动的信号).
此外,拥有操作存储允许在用户注销或关闭窗口之前轻松询问它们是否为待处理操作.
注意:我正在使用针对Rest API的单应用程序页面Web应用程序,我不认为在服务器端呈现时使用它
这是一个可行的选择创建一个ActionStore或我打破一些Redux/Flux基础?这可能会结束使用React Hot Reloading和Time travel的可能性吗?
你应该毫不留情地回答,我可能做了一堆丑陋的事情,但我正在学习React/Redux.
Dan*_*mov 23
对于未来可能有点困惑的读者:我们不再将这些功能称为"商店":我们称之为减速器.所以问题是关于减速器记住动作.
就个人而言,我不喜欢你在那里建议的方法.您将逻辑放入操作并使用继承.相反,Redux将行为规定为没有逻辑的普通对象.他们不应该"知道"如何更新某些状态,他们不应该持有它 - 相反,他们应该描述发生的事情.
我认为在Redux中实现乐观更新的方法类似于在Redux中实现Undo的方式,而Redux又受到Elm架构的启发.这个想法是你应该编写一个带有reducer(和一些选项)的函数并返回一个reducer:
function optimistic(reducer) {
return function (state, action) {
// do something?
return reducer(state, action);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以像普通的减速器一样使用它:
export default combineReducers({
something: optimistic(something) // wrap "something" reducer
})
Run Code Online (Sandbox Code Playgroud)
现在它只是将状态和动作传递给reducer它包装,但它也可以"记住"动作:
function optimistic(reducer) {
return function (state = { history: [] }, action) {
// do something with history?
return {
history: [...state.history, action],
present: reducer(state.history[state.history.length - 1], action)
};
}
}
Run Code Online (Sandbox Code Playgroud)
现在它累积了该history领域的所有行动.
同样,这本身并不是很有用,但你可能会看到如何实现这样的高阶减速器:
status: 'request';status: 'done',重置历史;status: 'fail',调整历史记录以不包括初始动作,status: 'request'并重新运行减速器以重新计算当前状态,就好像请求从未发生过一样.当然我没有提供实现,但这应该让您了解如何以Redux方式实现乐观更新.
更新:根据OP的评论,redux-optimist似乎正是如此.
| 归档时间: |
|
| 查看次数: |
3666 次 |
| 最近记录: |