为什么Redux使用开关而不是利用多态行为?
问题描述:
我是Redux的新手,立即引起我的注意的是Reducers开启类型。为什么Redux使用开关而不是利用多态行为?
下面是来自Vanilla Counter example的摘录:
function counter(state, action) {
if (typeof state === 'undefined') {
return 0
}
switch (action.type) {
case 'INCREMENT':
return state + 1
case 'DECREMENT':
return state - 1
default:
return state
}
}
// details omitted
document.getElementById('increment')
.addEventListener('click', function() {
store.dispatch({ type: 'INCREMENT' })
})
document.getElementById('decrement')
.addEventListener('click', function() {
store.dispatch({ type: 'DECREMENT' })
})
为什么不使用它是这样的呢?
function increment(state) { return state + 1; }
function decrement(state) { return state - 1; }
function counter(state, action) {
if (typeof state === 'undefined') {
return 0
}
return action.handler(state);
}
// details omitted
document.getElementById('increment')
.addEventListener('click', function() {
store.dispatch({ handler: increment, type: 'unused' })
})
document.getElementById('decrement')
.addEventListener('click', function() {
store.dispatch({ handler: decrement, type: 'unused' })
})
答
因此,您不希望将其放入操作的最大原因是因为您商店中的多个节点可能需要响应相同的操作。
dispatch({ type: "USER_LOGIN", payload: user });
这可能具有user
想要的动作反应,它可能希望在页眉/登录/注销功能反应,它可能需要的页面,你就反应过来,或访问级别反应。
如果你已经将数据的行为与页面的行为联系起来,那么你已经消除了这种能力,并排除了两者之间的分离。
绝对没有理由不能使用战略模式(而不是开关)并在其中使用您的功能。
function (state, action) {
const strategy = {
INCREMENT: increment,
DECREMENT: decrement,
default: identity
};
return (strategy[action.type] || strategy.default)(state, action);
}
的increment
等功能,能够在一定状态和行动,在该情况下,他们希望做一些进一步的降低,进一步嵌套的节点。
答
按照redux docs:
操作是普通的JavaScript对象。操作必须具有类型 属性,该属性指示正在执行的操作的类型。通常应将类型 定义为字符串常量。
Redux使用POJO实现了command pattern,因为它们可以被序列化记录并重播。使用这种模式,您可以录制一系列动作,然后重播(减少)状态回到您希望的位置,并使hot reloading with Time travel处于缩减状态。
这是一个使用redux命令模式轻松实现撤销/重做的great example。
相比之下,你所建议的回调不能被序列化和记录,这就违背了redux的原始目的。
如果你喜欢,你可以做到这一点,REDX。来自Dan Abramov:Redux并不认为你是如何创建减速器的,所以你可以使用任何你喜欢的惯例 – JordanHendrix