使用Redux将业务逻辑放在一个地方

时间:2016-04-05 21:51:16

标签: javascript redux

我喜欢Redux。它简单而有力 但是,当我开始使用它时,一个架构问题让我很生气。

如何在一个地方找到我的业务逻辑?

因为我有两个可能的地方找到它:

  • 动作创作者(AC)
  • 商店减速机(SR)

[AC] -> [Action] -> [SR]

以下是3个例子 防爆。 1和2 - 在同步方案中定位AC和SR中的业务决策 防爆。 3 - 在异步场景中在AC中做出的业务决策。

在我的项目中,我注意到业务决策如何在AC和SR之间迅速分散。因此每次我想调试一些东西时我都应该问自己 - 好吧,那么我要检查的决定位于哪里,AC还是SR?
从架构的角度来看,我更希望按域而不是AC / SR分割BL。

我的观点:虽然我了解纯缩减器的优点,可以实现热重载,时间旅行,撤消/重做功能,但我不确定我是否准备好了贸易逻辑可维护性。

但是,我只有一周的Redux 我错过了什么?

示例1(同步,决策在reducer中):

// action-creators.js

export function increment() {
  return {
    type: 'INCREMENT'
  }
}

export function decrement() {
  return {
    type: 'DECREMENT'
  }
}

// counter-reducer.js

export default function counter(state = 0, action) {
  switch (action.type) {
  case 'INCREMENT':
    return state + 1  // (!) decision of how to '(in|de)crement' is here
  case 'DECREMENT':
    return state - 1
  default:
    return state
  }
}

示例2(同步,决策在行动创作者中):

// action-creators.js

export function increment() {
  return (dispatch, getState) => {
    return {
      type: 'CHANGE_COUNTER',
      newValue: getState() + 1 // (!) decision of how to '(in|de)crement' is here
    }
  };
}

export function decrement() {
  return (dispatch, getState) => {
    return {
      type: 'CHANGE_COUNTER',
      newValue: getState() - 1
    }
  };
}

// counter-reducer.js

export default function counter(state = 0, action) {
  switch (action.type) {
  case 'CHANGE_COUNTER':
    return action.newValue
  default:
    return state
  }
}

示例3(异步,决策在行动创建者中):

// action-creators.js

export function login() {
  return async (dispatch, getState) => {
    let isLoggedIn = await api.getLoginState();

    if (!isLoggedIn) {  // (!) decision of whether to make second api call or not
      let {user, pass} = getState();
      await api.login(user, pass)
    }

    dispatch({
      type: 'MOVE_TO_DASHBOARD'
    })
  };
}

// some-reducer.js

export default function someReducer(state = 0, action) {
  switch (action.type) {
  case 'MOVE_TO_DASHBOARD':
    return {
      ...state,
      screen: 'dashboard'
    }
  default:
    return state
  }
}

1 个答案:

答案 0 :(得分:0)

你很好地涵盖了各种可能性。不幸的是,没有一个通用的答案。这是你的应用,你必须做出决定。

关于structuring business logic的Redux常见问题解答答案对该主题有很好的引用,并链接到一些相关的讨论。