javascript - ngrx - 使用@output 或直接与商店交互

标签 javascript angular ngrx

什么是更好的好习惯?! 因为 ngrx 给了我们痛处,所以我们可以监听状态,并且可以从任何组件分派(dispatch)操作。

所以我写了一些简单的待办事项列表应用程序:

容器:TodosListComponent

@Component({
  selector: 'todos-list',
  template: `
        <ul>
            <li *ngFor="let todo of list">
                <todo [todo]="todo"></todo>
            </li>
        </ul>
  `,
})
export class TodosListComponent implements OnInit {
  public list;
  constructor(private store: Store<any>) { }

  ngOnInit() {
    this.list = this.store.select('todos','list');  
  }

}

子级:Todo 组件

@Component({
  selector: 'todo',
  template: `
    <span>{{ todo.content}}</span>
    <span (click)="delete(todo)"> X </span>
  `,
})
export class TodoComponent implements OnInit {

  @Input() todo: Todo;
  constructor(
      private store: Store<any>
  ) { }

  ngOnInit() {

  }

  delete(todo) {
      this.store.dispatch({type: 'DELETE_TODO', payload: todo});
  }
}

所以我们以这种方式监听 TodosListComponent 上的列表(状态) 然后我们可以从任何组件更改列表,在这种情况下,我们从待办事项组件中删除待办事项列表将由商店自动更新。

但其他方法是使用@Output(事件发射器)然后从容器中派发 Action ?

我的问题是哪种方式更好,为什么?

我认为第一个更好,因为如果我们有更复杂的示例,例如监听结果(状态)的数据网格元素,我们可以从其他组件更改结果(状态),而无需复杂的事件发射器

我填写 @Output 的使用是不需要的,因为 store 使我们能够在任何地方监听和调度操作。

但是什么更好,为什么? :)

我不需要代码审查,因为我问的是数据流而不是这个应用程序代码(它是示例)。

谢谢!

最佳答案

在 ngRx 中,您有智能(容器)和哑(子)组件。因此,在您的情况下,列表组件是智能组件,因为它必须从状态订阅待办事项。 Todo 组件是dumb组件的一个很好的例子。它是 listcomponent 的子组件,不必知道 ngStore 的存在。

你为什么要这样做?这是一种降低组件复杂性的方法。如果您有大型应用程序,则很难跟踪所有知道商店的组件。

更多详细信息:

Smart Dumb Components explained with Code

A comprehensive introduction to ngRx

关于javascript - ngrx - 使用@output 或直接与商店交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45659633/

相关文章:

angular - 如果商品不在商店中,则发送一个操作来获取它

Angular 2如何防止订阅触发,除非 map 返回的两个值中的任何一个发生变化

rxjs - 逻辑或组合 2 个或多个可观察流

javascript - 如何将 Firebase 数据添加到 JavaScript 数组

javascript - 使用 json 将值传递到文本框

angular - 我们应该在 Angular 模板中使用管道而不是三元条件渲染吗?

Angular 2+,异步测试和 setTimeout

javascript - 使用 IntersectionObserver 实现粘性 header

javascript - 通过 AWS Ruby SDK 将 Base64 图像数据上传到 S3

javascript - 正则表达式不重复特殊字符