遵循“动作卫生”指南,如何使用多个执行相同操作的NGRX动作?

时间:2019-01-29 15:08:20

标签: angular redux ngrx

如果我有两个或多个执行相同操作但在应用程序的不同部分触发的NGRX操作,我可以使用一个操作来执行此操作,同时在NGRX日志中区分操作字符串吗?我问是因为,当编写动作并尝试遵循“动作卫生”原则时,动作应特定于事件,并且一年后可以读取,并告诉开发人员动作在应用程序中的确切位置,我想限制为尽可能多的NGRX样板。

例如:我有一个“ AddTodo”动作。可以在我的应用程序中的两个位置执行此操作-一个在“ Todo列表”页面上,另一个在“ Todo详细信息”页面上。每个操作对于触发它们的页面都是唯一的,但是它们做的完全相同。他们向我的状态对象添加了一个新的Todo项目。

const TODO_LIST = '[Todo List]';
const TODO_DETAILS = '[Todo Details]';

export const TODO_LIST_ADD = `${TODO_LIST} Add`;
export const TODO_DETAILS_ADD = `${TODO_DETAILS} Add`;

export class TodoListAdd implements Action {
    readonly type = TODO_LIST_ADD;
    constructor(public payload: Todo) { }
}

export class TodoDetailsAdd implements Action {
    readonly type = TODO_DETAILS_ADD;
    constructor(public payload: Todo) { }
}

export function todoReducer(state = initialState, action: Action): TodoState {
    switch (action.type) {
        case actions.TODO_LIST_ADD:
        case actions.TODO_DETAILS_ADD:
            return {
                ...state,
                todo: (action as actions.TodoListAdd | actions.TodoDetailsAdd).payload,
            }
        default:
            return state;
    }
}

如果要保持动作卫生,这是唯一的方法吗?有两个动作完全相同,唯一的区别是在NGRX事件日志中区分它们的字符串类型。我很乐意,有一种方法可以通过耦合动作创建者来减少样板数量,而不会失去类型的特异性。

谢谢

1 个答案:

答案 0 :(得分:1)

是的,如果您遵循良好的行动卫生习惯,这是唯一的方法。

但是,您可以按照https://medium.com/javascript-everyday/reusable-action-creators-with-context-2a31dca98192此处所述为操作提供上下文。