javascript - ngrx/redux 操作上下文的最佳实践

标签 javascript angular typescript redux ngrx

我试图找到这种情况的最佳实践,但我没有找到。

问题: 我不想重复 Action 文件,就像我的例子一样 home-todos.actions 和 sport-todos-actions,我想使用相同的 to-dos.action 文件。和相同的 reducer 。

示例: 例如,我编写了一个 todo 应用程序,在此示例中,如果我发送类型为“ADD_TODO_ASYNC”的操作,您会看到问题,它将在 home(effects and reducer) 和 sport(effects and reducer) 中发送

待办事项.actions.ts

const ADD_TODO_ASYNC = 'ADD TODO ASYNC';
const ADD_TODO_COMPLETE = 'ADD TODO COMPLETE';
const ADD_TODO_FAILD = 'AD TODO FAILD';

class addTodoComplete {
    type = ADD_TODO_COMPLETE;
}
class addTodoFaild {
    type = ADD_TODO_COMPLETE;
}

export type Actions = addTodoComplete | addTodoFaild;

运动效果.ts

@Injectable()
export class SportTodosService {

    @Effect() ADD_TODO_ASYNC$ = this.actions$.ofType(TodosActionTypes.ADD_TODO_ASYNC)
    .map(toPayload)
    .swithMap( (todo: Todo) => this.api.addTodo(todo))
    .map((todo: Todo) => TodosActionTypes.addTodoComplete(todo))
    constructor(
        private actions$: Actions,
        private api: api
    ) { }

}

home.effects.ts

export class HomeTodosService {
    @Effect() ADD_TODO_ASYNC$ = this.actions$.ofType(TodosActionTypes.ADD_TODO_ASYNC)
        ...
    constructor(
        ...
    ) { }

}

reducer

function todosReducer(state, action: TodosActionTypes.Actions) {
    switch (action.type) {
        case TodosActionTypes.ADD_TODO_COMPLETE:
            return state;
        default:
            return state;
    }
}

应用程序模块.ts

@NgModule({
    declarations: [
      AppComponent
    ],
    imports: [
      StoreModule.forRoot({
        sport: todosReducer,
        home: todosReducer,
      }),
      EffectsModule.forRoot([
        SportTodosService
        HomeTodosService,
      ])
    ],
    providers: [
        api
    ],
    bootstrap: [AppComponent]
  })
  export class AppModule { }

我试图了解这种情况下的最佳做法是什么? 使用“HOME_ADD_TODO”和“SPORT_ADD_TODO”等上下文编写操作?

或者有官方途径?

如果您知道解决方案,请不要关心该解决方案是针对 redux 还是 ngrx

谢谢大家

最佳答案

要理解这个问题,您需要重新思考您的应用架构。 一般来说,可重用的 reducer / Action 是不正确的。

为什么不对?在目前看来,编写可重用的 reducer 和 action,更少的样板文件,而不是“DRY”似乎很棒。以您的应用为例。家庭和运动的“ADD_TO_DO”是平等的。

但在未来会很危险,认为您的老板/客户需要 future 的体育运动 add_to_do。如果您更改可重用 reducer 中的逻辑。你的应用程序会崩溃。 (您可以开始使用 if 语句修补您的可重用 reducer 以使其工作,但如果您的应用程序增长,它将不灵活/可读/维护)。

所以是的,在这种情况下您似乎需要编写 2 个 reducer 和 2 个操作文件。现在是平等的, future 是优势和灵活的。

祝你好运!

关于javascript - ngrx/redux 操作上下文的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47994028/

相关文章:

javascript - Jquery中的横幅淡入淡出不起作用

javascript - Angular 6 正确初始化自定义输入组件

angular - 当数据在 ngfor 循环内时, Angular 错误

javascript - 为什么 typescript 使用 Angular ​​度编译我的基本 Controller 的局部变量?

typescript - 如何推断泛型参数的属性类型并映射到另一种类型

javascript - 接下来如何将react js中的普通表转换为使用react bootstrap表

javascript - 为什么我的一些按钮在 html5 Canvas 上不能正常工作?

javascript - 单选按钮在 Vue.js 中无法正常工作

javascript - 如何使子组件检测到来自父组件的对象(@Input())在Angular中发生了变化

reactjs - 我想使用react和ant.design(antd)验证输入的密码