javascript - 多个状态,相同的动作创建者
问题描述
我有两个柜台,COUNTER_1
和COUNTER_2
。所以我创建了多个减速器来处理它们。
export default (state = 0, action) => {
switch (action.type) {
case "INCREMENT_1":
return state + 1;
case "DECREMENT_1":
return state - 1;
default:
return state;
}
};
这是为了COUNTER_1
和类似的,COUNTER_2
我已经创建了
export default (state = 0, action) => {
switch (action.type) {
case "INCREMENT_2":
return state + 1;
case "DECREMENT_2":
return state - 1;
default:
return state;
}
};
现在我为他们创建了一个动作创建器,就像
export function increment(counterNumber) {
let stateSelector = counterNumber === 1 ? "INCREMENT_1": "INCREMENT_2"
return {
type: stateSelector
};
}
是否可以与action creator
上面示例中所示的多个减速器相同。我可能有其他功能,COUNTER_1
这些功能可能不存在于COUNTER_2
某个地方。但两者的基本特征都是INCREMENT
和DECREMENT
。
这样我以后可以独立地向两个计数器添加功能,同时保持基本功能相同。也许INCREMENT_BY_TWO
只是为COUNTER_1
.
解决方案
您可以为不同的计数器使用相同的减速器。
function createCounterWithNamedType(counterName = '') {
return function counter(state = 0, action) {
switch (action.type) {
case `INCREMENT_${counterName}`:
return state + 1;
case `DECREMENT_${counterName}`:
return state - 1;
default:
return state;
}
}
}
const rootReducer = combineReducers({
counterA : createCounterWithNamedType('A'),
counterB : createCounterWithNamedType('B'),
counterC : createCounterWithNamedType('C'),
});
store.dispatch({type : 'INCREMENT_B'});
console.log(store.getState());
// {counterA : 0, counterB : 1, counterC : 0const rootReducer = combineReducers({
counterA : createCounterWithNamedType('A'),
counterB : createCounterWithNamedType('B'),
counterC : createCounterWithNamedType('C'),
});
store.dispatch({type : 'INCREMENT_B'});
console.log(store.getState());
// {counterA : 0, counterB : 1, counterC : 0}}
推荐阅读
- c# - 使用枚举设置 Navlink Href 属性
- java - 如何使用 ViewModel 在 Fragment 之间共享数据
- while-loop - 无法创建嵌套的 while 循环
- python - 在每个数据框行中求和一个列表
- javascript - Javascript代码设计:如何尝试以一种好的方式捕捉每一行?
- python - 如何向在 Django 中上传文件的用户显示上传的文件?
- c++ - 为什么 GetExitCodeThread() 在这里返回 FALSE?
- laravel - 我想从 laravel 中的 vue.js 代码运行工匠命令
- elasticsearch - 具有不同操作系统的 Elasticsearch 复制集群
- php - 使用 php 对文件执行删除、编辑和搜索操作