我已经实现了一种相当简单的方法,可以useReducer
使用以下命令将undo添加到其中:
export const stateMiddleware = reducerFunc => {
return function(state = { history: [] }, action) {
return {
history:
action.type === UNDO
? drop(state.history) // lodash drop
: [reducerFunc(state.history[0], action), ...state.history],
}
}
}
和
const [state, dispatch] = useReducer(stateMiddleware(reducer), { history: [initialState] })
该state
变量由整个历史记录组成,因此必须从第一个元素中提取当前状态。
我想知道是否useReducer
将接受state
参数数组(也欢迎对我的方法发表评论-它避免使用似乎笨重的包装来做类似的事情)
为了给您一些有关通用方法的反馈,我将引用Redux文档,因为它们提供了许多有关全局状态管理的最佳实践。如果您以后需要充实的存储,这将使切换更加容易。我在这里假设您不仅要useReducer
对一个本地组件使用,而且要对全局状态树使用更多(感谢@DrewReese对此发表评论)。如果只有一个组件左右,那么您的方法就可以了!
Redux有关基本状态形状的文档以及在顶层(Link)都可以使用的数组:
Redux状态通常具有一个普通的Javascript对象作为状态树的顶部。(当然也可以使用另一种类型的数据,例如单个数字,数组或专用数据结构,但是大多数库都假定顶级值是普通对象。)最常见的组织方式该顶级对象中的数据将进一步将数据划分为子树,其中每个顶级键代表相关数据的某个“域”或“切片”。
因此,基本上可以,但其他库也可能会被优化并期望有一个对象,因为它是迄今为止最可能的选择。
如果您采用这种形状,请确保您的要求始终是整个状态都需要执行撤消操作。因为这是有代价的(除了提到的第3方库兼容性):
如果您的应用程序变得非常庞大并且您有数百个减速器,那该怎么办。每次调度您的操作时,都会在history数组中放置一个新的状态对象,这可能会造成混乱。如果您不希望进行全局撤消,而是进行非常精细的撤消(在一种特定的reducer中,例如针对UI中的一种特定表单元素),那该怎么办?然后,您必须区分全局撤消和特定撤消。可以只在每个感兴趣的减速器中以自己的方式处理的一个“ UNDO”动作又如何呢?
如果仍然符合您的要求,请尝试一下!
干杯
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句