javascript - Redux 操作和共享验证

标签 javascript reactjs redux react-redux reducers

我的 redux 存储中有一组步骤。我的 my steps reducer 通过处理一系列操作来操纵步骤列表:

  • ADD_STEP_REQUEST
  • REMOVE_STEP_REQUEST
  • MOVE_STEP_UP_REQUEST
  • MOVE_STEP_DOWN_REQUEST

到目前为止一切顺利。

我现在需要在每次更改步骤顺序(或添加或删除步骤时)时执行一种验证。在此验证期间,我需要检查每个步骤以查看它之前的步骤是否满足特定条件。如果没有,我不想拒绝更改。我只想在步骤上设置一个 isInvalid 标志,并最终更改步骤在 UI 中的显示方式。

我能处理这个问题的最简单方法是添加一个 validateOrder() 函数(应用标志并返回步骤),该函数在每个 case 语句末尾由 reducer 运行:

case ADD_STEP_REQUEST: {
  const amendedSteps = // add a step
  return validateOrder(amendedSteps);
}

case REMOVE_STEP_REQUEST: {
  const amendedSteps = // remove a step
  return validateOrder(amendedSteps);
}

case MOVE_STEP_UP_REQUEST: {
  const amendedSteps = // reorder steps
  return validateOrder(amendedSteps);
}

case MOVE_STEP_DOWN_REQUEST: {
  const amendedSteps = // reorder steps
  return validateOrder(amendedSteps);
}

但是,这感觉不对,因为我需要在所有 case 语句中重复调用 validateOrder

有没有更好的方法来处理这个问题?

最佳答案

reducer 只是一个函数。你可以用另一个函数包装它:

const yourReducer = (state = 'your initial state', action) => {
  switch (action.type) {
    case ADD_STEP_REQUEST:
      // ...
      return amendedSteps

    case ...
  }
}

const validatedReducer = (state, action) => {
  switch (action.type) {
    case ADD_STEP_REQUEST:
    case REMOVE_STEP_REQUEST:
    case MOVE_STEP_UP_REQUEST:
    case MOVE_STEP_DOWN_REQUEST:
      return validateOrder(yourReducer(state, action))

    default:
      return yourReducer(state, action)
  }
}

现在你把责任分开了。原始 reducer 不需要关心验证。 validatedReducer 会处理这个问题。

如果validateOrder必须应用于所有情况,那么您就不需要validatedReducer中的switch语句,所以它会变成:

const validatedReducer = (state, action) =>
  validateOrder(yourReducer(state, action))

关于javascript - Redux 操作和共享验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42553873/

相关文章:

javascript - 如何在 react.js 的 Jest 测试中触发 Pubsub.js 事件

reactjs - 如何以 redux 形式更新数组字段值?

javascript - redux connect mapStateToProps 在调度 Action 时不调用

JavaScript 相当于 Python 的 oauth2client 对 Google 提醒的 POST 请求

javascript - jQTouch在AJAX页面加载时执行代码

javascript - 使用 audio.play() 函数时 react 错误

reactjs - 如何为不同的商店设置多个供应商?

javascript - 如何使用 Dart 解析 YouTube URL 以从 URL 获取视频 ID?

javascript - Javascript 中嵌套函数 "Class"结构中的变量范围

javascript - 如何通过在 JavaScript 项目中移动文件来重构并自动更新引用?