React的useReducer钩子的reducer函数是否必须是纯函数?

时间:2020-08-19 23:56:12

标签: reactjs

The docs for the useReducer hook有点含糊:

接受类型为(state, action) => newState的化简器,并返回与dispatch方法配对的当前状态。 (如果您熟悉Redux,则已经知道它的工作原理。)

The Redux docs然后说

还原剂保持纯净非常重要。您应该从不在简化器中执行的操作:

  • 更改其参数;
  • 执行副作用,例如API调用和路由转换;
  • 调用非纯函数,例如Date.now()Math.random()

但是我没有使用Redux。 React文档似乎没有说到减速器必须是纯净的。只是模糊的说法是,认识Redux的人“已经知道它是如何工作的”。

因此, useReducer的化简函数是否必须是纯函数?如果是,为什么呢?如果不是,应该是纯净的吗?同样如果是,为什么?

我正在想象一个将状态更新为“正在加载”的动作,同时触发一个API调用,该API调用在响应时将分派另一个动作,然后再次更新状态。

1 个答案:

答案 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不应出于相同的原因,而不会将所有代码都放在一个组件中:每个函数/文件/组件都具有特定的用途。减少是为了状态。