使用 OnPush 更改检测的最佳方式



使用OnPush更改检测来灵活更改且在测试中也非常简单的最佳方法是什么?通过各种教程,我发现可以使用OnPush

  1. 首先是直接在视图中使用服务主题的可观察性 我不确定这种方法是否有效。 https://blog.angular-university.io/onpush-change-detection-how-it-works/。
  2. 另一种选择是使用不可变.js但在这种情况下,我不知道创建对象是否非常灵活,我知道在列表的情况下更容易。

也许你知道我列出的不同的方法?

  1. 将可观察量与管道一起使用async是一个完全有效的选项,我经常使用它。Angular 能够检查可观察量何时发出值,并标记您的组件以检测更改。
  2. 不可变.js也是一个有效的选择,但我个人觉得有点太冗长了。在我目前的项目中,我更喜欢使用 ES6 传播运算符。例如,要更新属性,请使用const newObj = {...obj, prop: newValue},将项目插入数组const newArray = [...array, newItem]。但是,您必须确保整个团队都采用这种方法,因为无法像不可变.js那样强制执行不可变性。

我的团队正在使用page - component模式。例如,我们需要创建一个功能来更新用户详细信息。在这种情况下,我会创建user-page.componentuser-form.componentuser-page.componentuser-form.component的容器。

user-form.component 具有ChangeDetectionStrategy.OnPush,它不与服务交互,它只有许多输入属性(假设@Input user: User(并发出@Output事件(例如@Output update = new EventEmitter<User>()(。它是一个">哑">组件,它只是更新表单并发出事件。

user-page.component 是与服务交互、设置输入属性和侦听user-form.component事件的人。它的模板标记通常只包含子组件:

<app-user-form [user]="user$ | async" (update)="onUpdate($event)"></app-user-form>

user$是一个来自服务或存储的可观察量,它通过异步管道传递到user-form.component中。onUpdate是当用户单击用户表单上的"更新"按钮时调用的函数,它调用 API 服务来更新用户详细信息。

遵循此模式可将与服务交互的组件和仅显示数据的组件分开,从而允许您控制更改检测。顺便说一下,NGRX官方示例应用程序使用相同的方法。

最新更新