更新 redux 商店上的 isLoading 字段

Updating isLoading field on a redux store

我有指示我的应用程序正在加载的微调器。我的应用程序中的许多减速器都需要能够将此加载器设置为 true 或 false。

我的假设: 该字段需要位于状态树的最顶层。我们称它为 isLoading.

问题: Redux reducers 更新它们自己的状态树部分。我可以通过哪些方式构建我的 reducer 以更新最顶层的 isLoading 字段?

我对 redux-thunk 很熟悉,但是在每个操作上都发送一个事件似乎有点矫枉过正。但也许我错了,这是正确的做法。另外,我当然有可能错误地设计了我的状态树。

作为参考,我目前正在使用 redux thunk:

export const fetchAssets = () => {
  return dispatch => {
    request
      .get('http://myapi.com/assets')
      .set('Accept', 'application/json')
      .end(function(err, res){
        if (err) {
          return dispatch(fetchAssetsFailure(err));
        }
        dispatch(fetchAssetsSuccess(res.body.data));
      });
  }
}

Reducer 接收所有分派的操作,因此您希望 isLoading reducer 对每个相关操作做出反应,而不是其他 reducer 设置此值。显然,您不能使用 action.type 因为您无法预测所有相关操作,而且它会创建一个非常麻烦的 reducer。你可以做的是在 action 中添加另一个字段,这个 reducer 将对该字段做出反应。

示例操作创建者:

const createSampleAction = (payload, isLoading) => ({
    type: 'SAMPLE_ACTION',
    payload,
    meta: {
        isLoading
    }
});

和减速器:

const isLoadingReducer = (state = false, { meta }) => {
  const isLoading = meta && meta.isLoading;

  if (isLoading !== undefined) {
      return isLoading;
  }

  return state;
}

如果您不喜欢使用 meta 而不是 action 类型的 reducer,您可以创建一个中间件来执行相同的操作 属性 来分派 showLoading / hideLoading 操作,reducer 会做出反应对于这些操作:

const isLoadingMiddleware = ({ dispatch }) => next => {
  next(action);
  const isLoading = action.meta && action.meta.isLoading;

  if (isLoading !== undefined) {
      dispatch(isLoading ? showLoading () : hideLoading());
  }
}