NGRX组件存储效果是通过调用patchState来循环的

问题描述 投票:0回答:1

我的效果无限循环,我不知道为什么。

  interface LatestAppointmentsWidgetState {
    loading: boolean;
    page: number;
    pagedData: Paged<Appointment>;
  }

  @Injectable()
  export class LatestAppointmentsWidgetStore extends ComponentStore<LatestAppointmentsWidgetState> {

  private readonly params$ = this.select(state => ({
    page: state.page
  }));

  readonly loadBusinesses = this.effect(() => {
    return this.params$.pipe(
      tap({ next: () => this.patchState({ loading: true }) })
    );
  });
}

我尝试只保留相关代码。看起来效果中的 patchState 触发了

params$
选择器。但根据我的理解 patchState 应该只更新与作为参数传递的部分状态匹配的状态。有谁知道为什么会发生这种情况?

angular ngrx ngrx-component-store
1个回答
0
投票

发生这种情况是因为:

  1. 补丁状态更新状态
  2. 选择器“反应”新状态
  3. 选择器创建一个新实例
  4. 由于新实例,效果被重新触发

为了防止这种情况,请考虑仅返回布尔值。

  private readonly page$ = this.select(state => state.page);

  // you can use it to recreate params$
  private readonly params$ = this.select(this.page$, page => ({page});

第二个选择是使效果“更智能”并忽略重新发射,例如通过使用

distinct(By)

© www.soinside.com 2019 - 2024. All rights reserved.