Redux中的Action应该始终是唯一的吗?

时间:2015-12-25 04:55:21

标签: redux

在此示例中,我使用名为 ADD_TODO 的行动

import { createStore, combineReducers } from 'redux';

function todos(state, action) {
    state = state || [];
    switch (action.type) {
        case 'ADD_TODO':
            return state.concat([ action.text ]);
        default:
            return state;
    }
}

function counter(state, action){
    state = state || 0;
    switch (action.type){
        case 'INCREMENT':
            return state+1;
        case 'DECREMENT':
            return state-1;
        case 'ADD_TODO':
            return state+100;
        default:
            return state;
    }
}

var app = combineReducers({
    todos: todos,
    counter: counter
});

var store = createStore(app);
store.dispatch({ type: 'ADD_TODO': text: 'buy eggs' });

这会导致" todos "和" 反击"减速器触发。 除非我真的想要,否则我应该让所有减速器都有独特的动作吗?

我们如何使用多个同样可以做同样事情的减速器实现这一点?例如,多个计数器可以具有" INCREMENT"和一个" DECREMENT"动作。

名称间距动作应该解决吗?

  

例如:" POINT_INCREMENT"," POINT_DECREMENT"。

2 个答案:

答案 0 :(得分:0)

让不同的减速器响应同一个动作没有任何内在错误 - 例如,如果你立刻刷新整个状态。但是,如果你有两个对应不同事物的计数器,你可能想要一个命名方案来区分。但我认为动作名称可能应该有一些名词来表明它们适用于什么。

答案 1 :(得分:0)

  

这会导致“待办事项”和“计数器”归约器触发。除非我确实打算,否则是否应让所有减速器采取独特的动作?

是的,可能他们应该有不同的独特动作。 从您的示例中并不清楚您真正打算做什么。
柜台应该计算待办事项的数量吗? 在那种情况下,“ ADD_ITEM”操作既可以更新计数器,又可以添加待办事项,这实际上是明智的。在这种情况下,请参考acjay的答案

  

我们如何用几乎做同一件事的多个reducer来实现呢?例如,多个计数器可以具有“ INCREMENT”和“ DECREMENT”动作。

在同一应用中显示计数器列表时,可以为每个计数器分配一个唯一的标识符(id)。
动作应传递计数器的ID。

export const toggleTodo = id => ({
  type: 'INCREMENT',
  id
})

然后,减速器应按ID检查要更新的计数器。
请参阅官方redux文档中的待办事项列表示例。 https://redux.js.org/basics/example

Redux动作在某种程度上是全局的。有不同的策略可以更大规模地解决此问题。 https://kickstarter.engineering/namespacing-actions-for-redux-d9b55a88b1b1