javascript - 为什么返回default case而不是扔进Redux的reducer?

标签 javascript reactjs redux

我读了很多 Redux 教程,所有教程都返回默认情况而不是 throw,他们写的是这样的:

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

既然我们已经知道开发人员一定已经被分派(dispatch)了不存在的操作类型,为什么不抛出错误呢?像这样:

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}`)
  }
};

为什么不扔?

最佳答案

对于 Redux,您可能有多个 reducer ,您可以使用 combineReducers 将它们组合起来形成一个存储。当您调度一个操作时,它会被调度到所有 reducer ,并且仅调度到预期的 reducer 。因此,您将有一个返回当前状态的默认情况。

当该操作被分派(dispatch)到所有 reducer 时,只有必须处理该操作的 reducer 才会监听该操作并更新状态。这可能会导致操作被调度,但不会被任何 reducer 处理,但肯定不会导致问题,并且永远不会发生,除非您忘记编写此代码。

但是,如果您使用单个 reducer 而不将它们组合起来(通常是使用 useReducer 钩子(Hook)的情况),则如果没有分派(dispatch)匹配的操作,您可能会抛出错误。

关于javascript - 为什么返回default case而不是扔进Redux的reducer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55877893/

相关文章:

javascript - 如何在 React 中循环 className over children

javascript - 如何从 React/Redux 中的对象生成和呈现无序列表?

javascript - React, transition group - 交换组件时的 css 转换

javascript - 动画和过渡同时进行?

javascript - YUI 中限制拖动模块

javascript - 为什么这个原型(prototype)字段优先于同一个对象字段?

reactjs - React (create-react-app) 中的 tsc 编译需要显式编译标志,尽管我在 tsconfig.json 中设置了它们

javascript - 非标准化数据如何导致 React Redux 出现问题?

带有传播成员的 TypeScript 接口(interface)

javascript - 如何在 redux 中使用 setTimeout 和调度程序触发周期性操作