站長資訊網
最全最豐富的資訊網站

如何利用管道提高Angular應用程序的性能?

如何利用管道提高Angular應用程序的性能?本篇文章通過代碼示例來給大家詳細介紹一下利用管道提高Angular應用程序性能的方法。

如何利用管道提高Angular應用程序的性能?

我們通過一個例子來演示下:

Example

@Component({   selector: 'my-app',   template: `     <p *ngFor="let user of users">       {{ user.name }}有一只貓 {{ getCat(user.id).name }}     </p>   `,   styleUrls: ['./app.component.css'] }) export class AppComponent {   users = [{ id: 1, name: 'wang' }, { id: 2, name: 'li' }];   cats = [{ name: 'Tom', userId: 1 }, { name: 'Jerry', userId: 2 }];    getCat(userId: number) {     console.log('User', userId);     return this.cats.find(c => c.userId === userId);   } }

有兩組數據分別是 userscats,可以把 users 理解為傳入數據,或者是其他數據源。通過 getCat() 方法獲取對應的 貓咪,這種場景再業務開發中再熟悉不過。 最后添加全局模板直接進行一個循環輸出。【相關教程推薦:《angular教程》】

接下來看下輸出

User 1 User 2 User 1 User 2 User 1 User 2 User 1 User 2

可以 getCat() 方法調用了 8 次,有 6 次無用調用。這是因為當在模板內使用方法時,angular 每次變更檢測都會調用其方法。

我們可以添加一個監聽事件

@HostListener('click') clicked() { }

每當點擊事件觸發,就會調用 4

User 1 User 2 User 1 User 2

這不是我想要,我只想讓它調用兩次啊!!!數據量大了這么玩頂不住。


Pure Pipe

接下來就是主角登場了。我們先創建一個 pipe

@Pipe({   name: 'cat', }) export class CatPipe implements PipeTransform {   constructor(private appComponent: AppComponent) {}    transform(value, property: 'name' | 'userId'): unknown {     console.log('User', value);     const cat = this.appComponent.cats.find(c => c.userId === value);     if (cat) {       return cat[property];     }   } }

可以看到 pipe 的實現與之前調用的方法基本是一樣的,在模板中添加引用之后,卻發現結果符合之前的預期了,只調用了兩次。

這是因為 pipe 默認是 pure pipe,且 Pipe 裝飾器有 pure 可用來設置管道模式。

@Pipe({   name: 'cat',   pure: true })

pure 表示的是: transform 的值(入參value)發生變化時是否 不跟隨變更檢測調用

官方解釋:如果該管道具有內部狀態(也就是說,其結果會依賴內部狀態,而不僅僅依賴參數),就要把 pure 設置為 false。 這種情況下,該管道會在每個變更檢測周期中都被調用一次 —— 即使其參數沒有發生任何變化。 When true, the pipe is pure, meaning that the transform() method is invoked only when its input arguments change. Pipes are pure by default.

當把 pure 改成 false,會隨變更檢測調用多次,不管值發生變化沒。

了解變更檢測機制:

[譯]深入理解Angular onPush變更檢測策略

https://zhuanlan.zhihu.com/p/96486260

這樣我們通過 pipe 代替模板中的方法,就減少了 angular 模板中不必要的調用。

總結

當模板中數據為靜態數據需要轉換或加工時,調用pipe比調用方法好。

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产精品爽黄69天堂a片| 久久综合精品国产一区二区三区| 久久精品免费全国观看国产| 5x社区精品视频在线播放18| 国产精品三级国产电影| 国产精品露脸国语对白河北| 国产精品特级毛片一区二区三区| 国产精品无码v在线观看| 亚洲AV日韩综合一区尤物| 国产精品福利午夜在线观看| 亚洲国产aⅴ成人精品无吗| 无码日韩精品一区二区三区免费| 热99re久久免费视精品频软件| 99精品国产一区二区三区2021| 亚洲精品亚洲人成在线观看麻豆 | 日本免费精品一区二区三区 | 国产精品亚洲综合一区| 亚洲日韩国产精品乱| 青青草97国产精品免费观看| 日韩亚洲翔田千里在线| 亚洲精品线在线观看| 国产精品久久久久国产A级| 一夲道无码人妻精品一区二区 | 国产精品密蕾丝视频| 精品视频一区二区三三区四区| 亚洲色图国产精品| 久久香蕉国产线看观看精品yw| 午夜精品久久久久久99热| 亚洲国产精品特色大片观看完整版| 国产中老年妇女精品| 精品九九久久国内精品| 99久久成人国产精品免费| 99视频在线观看精品| 亚洲精品tv久久久久久久久| 精品国产福利第一区二区三区| 久久成人影院精品777| 久久最新精品国产| 久久的精品99精品66| 99久久亚洲综合精品成人网| 69久久夜色精品国产69小说| 亚洲精品国产手机|