【问题标题】:Is it ok to make backend call using reducer in redux?在redux中使用reducer进行后端调用可以吗?
【发布时间】:2019-12-15 04:11:43
【问题描述】:
我正在建立一个有角度的网站。通常我在 onInit 方法中进行后端调用并将数据存储在组件状态中。现在我想将 redux 添加到我的网站。我应该只对 onInit 方法进行操作并在 redux reducer 中进行实际的后端调用,还是应该在我的组件 onInit 方法中进行后端调用并稍后将数据添加到 redux 状态?哪一个是正确的做法?听说redux reducer应该是纯函数,后端调用是不是让函数不纯了?
【问题讨论】:
标签:
angular
redux
redux-store
ngredux
【解决方案1】:
您不应该在 reducer 中进行后端调用。 Redux docs say:
reducer 是一个纯函数,它接受前一个状态和一个动作,并返回下一个状态
还有:
没有副作用。没有 API 调用。没有突变。只是一个计算。
Redux 中的副作用可以通过redux-thunk、redux-saga 完成,或者在普通的 Redux 中间件中进行副作用调用。
在这些选项中,redux-thunk 最容易上手。它允许您在操作中执行异步/副作用。
// store.js
import thunk from 'redux-thunk';
const myReduxStore = createStore(myRootReducer, applyMiddleware(thunk));
// actions.js
const myAction = (someArg) => {
return dispatch => {
myApiCall().then(result => {
dispatch({ type: 'YAY_SUCCESS', result })
})
}
}
然后当你派发动作时
dispatch(myAction())
异步副作用将在调度调用之后、reducer 接收操作之前发生。
【解决方案2】:
是的,你不应该在 reducer 中进行 api 调用,因为它们应该是纯粹的并且没有任何副作用。
我是否应该在我的组件 onInit 方法中进行后端调用并添加
稍后将数据转换为 redux 状态?
我建议采用这种方法。