为什么要返回默认大小写而不是在Redux的reducer中抛出?

时间:2019-04-27 06:28:23

标签: javascript reactjs redux

我已经阅读了很多Redux教程,所有教程都返回默认大小写而不是抛出异常,他们写的是这样的:

const counter = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      return state;
  }
};

为什么不抛出错误,因为我们已经知道必须派遣开发人员不存在的操作类型?像这样:

const counter = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      throw new Error(`Unknow action type: ${action.type}`)
  }
};

为什么不扔?

2 个答案:

答案 0 :(得分:2)

在Redux的情况下,您可能具有多个化简器,它们可以使用combineReducers组合在一起以形成一个商店。当您分派一个动作时,它会分派给所有的reducer,而只会分派给预期的那一个。因此,在默认情况下,您将返回当前状态。

在将动作分派给所有reducer的同时,只有那些必须处理该动作的人会监听它并更新状态。这可能会导致某个动作被分派,但没有被任何化简器处理,但是肯定不会引起问题,除非您忘记编写此代码,否则绝不会发生。

但是,如果您使用单个化合器而不组合它们(这通常是使用useReducer钩子的情况),那么如果没有调度匹配的动作,则会引发错误。

答案 1 :(得分:1)

创建减速器时,目的不是要取回错误来代替我们的新状态,而是要在没有新状态可用时返回现有状态。

const hiringProcess = (oldListOfCandidates, action) => {
  if (action.type === 'CREATE_CANDIDATE') {
    // we care about this action
    return [...oldListOfCandidates, action.payload];
  }
   // we don't care about this action
}

因此,使用ES2015语法,我获取了一个oldListOfCandidates数组并将其添加到一个全新的数组中,然后添加了一个新记录action.payload

无论如何,您的问题不是关于键插值语法,而是为什么return state;而不是抛出错误。

出于简化程序的目的以及我们整个redux架构应该为我们做的事情,我们不在乎返回错误,我们要返回的是现有数据,或者如果我们返回state没有新数据,这就是这些减速器的全部要点。

const hiringProcess = (oldListOfCandidates, action) => {
  if (action.type === 'CREATE_CANDIDATE') {
    // we care about this action
    return [...oldListOfCandidates, action.payload];
  }
   // we don't care about this action
   return oldListOfCandidates;
}

因此,如果没有要添加到state的新候选人,那么我们就不需要或想要一个错误来说明为什么不更新state的错误,我们只想return state;已经有。

您已经知道第一次调用reducer时,它将收到undefined的值,我们只需要像这样默认为state设置第一个参数的值即可:

const hiringProcess = (oldListOfCandidates = [], action) => {
  if (action.type === 'CREATE_CANDIDATE') {
    // we care about this action
    return [...oldListOfCandidates, action.payload];
  }
   // we don't care about this action
   return oldListOfCandidates;
}

我之所以说state,是因为我在他们默认action对象的值的商店做过工作,无法向我解释为什么这样做,而同时又没有这样做麻烦去纠正它,所以不要这样做是不必要的。

相关问题