为什么 slice 是一个不纯的管道?

Why is slice an impure pipe?

我一直认为 slice 是纯粹的,它比在字符串或数组上调用 slice 方法的唯一优势是 Angular.[=17 中纯管道的缓存机制=]

事实并非如此,slice是不纯的。此外,实现是非常基本的:它防止 nulls 并委托给 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);
    }
}