The docs for the useReducer
hook有点含糊:
接受类型为
(state, action) => newState
的化简器,并返回与dispatch
方法配对的当前状态。 (如果您熟悉Redux,则已经知道它的工作原理。)
还原剂保持纯净非常重要。您应该从不在简化器中执行的操作:
- 更改其参数;
- 执行副作用,例如API调用和路由转换;
- 调用非纯函数,例如
Date.now()
或Math.random()
。
但是我没有使用Redux。 React文档似乎没有说到减速器必须是纯净的。只是模糊的说法是,认识Redux的人“已经知道它是如何工作的”。
因此, useReducer
的化简函数是否必须是纯函数?如果是,为什么呢?如果不是,应该是纯净的吗?同样如果是,为什么?
我正在想象一个将状态更新为“正在加载”的动作,同时触发一个API调用,该API调用在响应时将分派另一个动作,然后再次更新状态。
答案 0 :(得分:0)
记住useReducer
:状态下的减速器是做什么用的。与使用10个useState
挂钩相比,这是将一堆状态分组到一个位置的一种方式。因此,在减速器中,您不应该产生副作用。副作用有一个地方:useEffect
钩子。
以您的加载状态示例为例,您只需执行以下操作:
useEffect(() => {
dispatch({type: 'SET_LOADING', payload: true})
// fetch your stuff
dispatch({type: 'SET_LOADING', payload: false})
}, [/* your dependencies */])
反应遵循功能范式,功能纯度是其中的重要部分。减速器可能具有副作用(毕竟它们只是功能)。 Reducers不应出于相同的原因,而不会将所有代码都放在一个组件中:每个函数/文件/组件都具有特定的用途。减少是为了状态。