为什么 slice 是一个不纯的管道?
Why is slice an impure pipe?
我一直认为 slice
是纯粹的,它比在字符串或数组上调用 slice
方法的唯一优势是 Angular.[=17 中纯管道的缓存机制=]
事实并非如此,slice
是不纯的。此外,实现是非常基本的:它防止 null
s 并委托给 slice
方法。没有最后转换输入的内部比较。
我怀疑它是为了与 ngFor
的行为保持一致而设计的,但这是一个可行的理由吗?新手会抱怨 Angular 坏了 否则我想,但话又说回来,我为什么要使用这个管道?
我是否正确认为它会在每次更改检测中创建新数组 运行,这甚至会触发 OnPush
三项更改检测并使性能优化无效?
编辑:这个问题是基于应该使用不可变数据的假设。
这个管道是不纯的,否则它会return相同的结果,直到数组引用改变,所以当数组项改变时它不会工作。
我个人认为使用这样的管道是不好的设计。由于性能问题,他们删除了 FilterPipe。事实上,每次检测到变化都会触发一个管道,而且有很多!我认为切片管也应该被移除。对我来说,这是一个快速而肮脏的解决方案,带来的问题多于解决的问题。
我建议您在需要时自己对数组进行切片。
除了 Guerric P ,有时使用纯切片管可能会很方便。幸运的是,创建一个很容易:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'pureSlice'
})
export class PureSlicePipe implements PipeTransform {
transform(str: string, start?: number, end?: number): string;
transform<T>(arr: readonly T[], start?: number, end?: number): T[];
transform(obj: string | readonly unknown[], start?: number, end?: number): string | unknown[] {
return obj.slice(start, end);
}
}
我一直认为 slice
是纯粹的,它比在字符串或数组上调用 slice
方法的唯一优势是 Angular.[=17 中纯管道的缓存机制=]
事实并非如此,slice
是不纯的。此外,实现是非常基本的:它防止 null
s 并委托给 slice
方法。没有最后转换输入的内部比较。
我怀疑它是为了与 ngFor
的行为保持一致而设计的,但这是一个可行的理由吗?新手会抱怨 Angular 坏了 否则我想,但话又说回来,我为什么要使用这个管道?
我是否正确认为它会在每次更改检测中创建新数组 运行,这甚至会触发 OnPush
三项更改检测并使性能优化无效?
编辑:这个问题是基于应该使用不可变数据的假设。
这个管道是不纯的,否则它会return相同的结果,直到数组引用改变,所以当数组项改变时它不会工作。
我个人认为使用这样的管道是不好的设计。由于性能问题,他们删除了 FilterPipe。事实上,每次检测到变化都会触发一个管道,而且有很多!我认为切片管也应该被移除。对我来说,这是一个快速而肮脏的解决方案,带来的问题多于解决的问题。
我建议您在需要时自己对数组进行切片。
除了 Guerric P
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'pureSlice'
})
export class PureSlicePipe implements PipeTransform {
transform(str: string, start?: number, end?: number): string;
transform<T>(arr: readonly T[], start?: number, end?: number): T[];
transform(obj: string | readonly unknown[], start?: number, end?: number): string | unknown[] {
return obj.slice(start, end);
}
}