我喜欢Redux。它简单而有力 但是,当我开始使用它时,一个架构问题让我很生气。
如何在一个地方找到我的业务逻辑?
因为我有两个可能的地方找到它:
[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
}
}
答案 0 :(得分:0)
你很好地涵盖了各种可能性。不幸的是,没有一个通用的答案。这是你的应用,你必须做出决定。
关于structuring business logic的Redux常见问题解答答案对该主题有很好的引用,并链接到一些相关的讨论。