<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      14_自定義管道實踐

      自定義管道實踐:高效數(shù)據(jù)轉換工具

      管道(Pipe)是Angular中用于數(shù)據(jù)轉換的核心工具,能夠在模板或代碼中以聲明式方式處理數(shù)據(jù)格式,如日期格式化、數(shù)值轉換、文本處理等。Angular內置了十余種常用管道,同時支持開發(fā)者自定義管道以滿足業(yè)務場景需求。本章將從管道基礎出發(fā),結合Angular v20特性,系統(tǒng)講解自定義管道的開發(fā)流程、高級技巧與最佳實踐,助力構建可復用、高性能的數(shù)據(jù)轉換邏輯。

      1. 管道基礎:概念與核心特性

      1.1 管道的本質與作用

      管道本質是純函數(shù)(輸入確定則輸出確定),接收原始數(shù)據(jù)作為輸入,經(jīng)過轉換處理后返回新數(shù)據(jù),且不會修改原始數(shù)據(jù)。其核心價值在于:

      • 模板解耦:避免在模板中編寫復雜數(shù)據(jù)處理邏輯,提升可讀性
      • 邏輯復用:將重復的數(shù)據(jù)轉換邏輯封裝為管道,跨組件復用
      • 聲明式使用:通過|語法在模板中直接調用,簡潔直觀

      1.2 管道的分類與核心屬性

      Angular管道分為兩類,核心區(qū)別在于是否具備緩存機制:

      類型 核心特性 適用場景
      純管道(Pure Pipe) 僅當輸入值或參數(shù)變化時重新計算,自動緩存結果 無外部依賴的純數(shù)據(jù)轉換(如格式化、脫敏)
      非純管道(Impure Pipe) 每次變更檢測都會重新計算,無緩存 依賴外部狀態(tài)的轉換(如依賴服務數(shù)據(jù)、動態(tài)配置)

      管道的核心屬性通過@Pipe裝飾器定義,v20中推薦使用獨立管道standalone: true),無需依賴模塊即可直接導入使用:

      import { Pipe, PipeTransform } from '@angular/core';
      
      @Pipe({
        name: 'customPipe', // 管道名稱(模板中使用)
        standalone: true,   // 獨立管道(v20推薦)
        pure: true          // 純管道(默認值,可省略)
      })
      export class CustomPipe implements PipeTransform {
        // 必須實現(xiàn)的轉換方法:value為輸入值,args為可變參數(shù)
        transform(value: any, ...args: any[]): any {
          // 轉換邏輯
          return transformedValue;
        }
      }
      

      1.3 常用內置管道速覽

      Angular內置管道覆蓋了大部分基礎數(shù)據(jù)轉換場景,掌握其用法可減少重復開發(fā):

      • 日期處理DatePipe(如{{ date | date:'yyyy-MM-dd' }}
      • 數(shù)值格式化DecimalPipe(如{{ 1234 | number:'1.2-2' }})、CurrencyPipe(如{{ 99 | currency:'CNY' }}
      • 文本處理UpperCasePipeLowerCasePipeSlicePipe(如{{ text | slice:0:10 }}
      • 異步數(shù)據(jù)AsyncPipe(自動訂閱/取消訂閱,如{{ data$ | async }}

      2. 自定義管道開發(fā):從基礎到進階

      自定義管道的開發(fā)遵循"需求分析→邏輯實現(xiàn)→測試復用"的流程,需結合業(yè)務場景選擇管道類型(純/非純),并確保轉換邏輯的健壯性。

      2.1 基礎純管道:數(shù)據(jù)脫敏處理

      純管道適用于無外部依賴的靜態(tài)數(shù)據(jù)轉換,以手機號脫敏為例,實現(xiàn)輸入手機號輸出"138****5678"格式:

      步驟1:實現(xiàn)管道邏輯

      // phoneMask.pipe.ts
      import { Pipe, PipeTransform } from '@angular/core';
      
      @Pipe({
        name: 'phoneMask',
        standalone: true // 獨立管道,支持直接導入
      })
      export class PhoneMaskPipe implements PipeTransform {
        /**
         * 手機號脫敏
         * @param value 原始手機號(11位數(shù)字)
         * @param showLen 保留前綴長度(默認3位)
         * @returns 脫敏后的手機號
         */
        transform(value: string | number, showLen: number = 3): string {
          // 1. 校驗輸入:非空且為11位數(shù)字
          if (!value) return '';
          const phoneStr = String(value).trim();
          if (!/^\d{11}$/.test(phoneStr)) return phoneStr; // 校驗失敗返回原始值
          
          // 2. 脫敏邏輯:保留前綴,中間4位替換為*,保留后綴4位
          const prefix = phoneStr.slice(0, showLen);
          const suffix = phoneStr.slice(-4);
          return `${prefix}****${suffix}`;
        }
      }
      

      步驟2:在組件中使用

      // 組件代碼
      import { Component } from '@angular/core';
      import { PhoneMaskPipe } from './phoneMask.pipe';
      
      @Component({
        selector: 'app-user-profile',
        standalone: true,
        imports: [PhoneMaskPipe], // 導入獨立管道
        template: `
          <!-- 基礎用法:默認保留3位前綴 -->
          <p>手機號:{{ user.phone | phoneMask }}</p>
          
          <!-- 自定義前綴長度:保留4位前綴 -->
          <p>手機號:{{ user.phone | phoneMask:4 }}</p>
        `
      })
      export class UserProfileComponent {
        user = { phone: '13812345678' };
      }
      

      輸出結果

      手機號:138****5678
      手機號:1381****678
      

      2.2 帶參數(shù)的管道:數(shù)組過濾與排序

      管道支持多參數(shù)傳入,以數(shù)組過濾排序管道為例,實現(xiàn)按關鍵詞過濾、按字段排序的組合功能:

      // filterSort.pipe.ts
      import { Pipe, PipeTransform } from '@angular/core';
      
      // 定義排序方向類型
      type SortDirection = 'asc' | 'desc';
      
      @Pipe({
        name: 'filterSort',
        standalone: true
      })
      export class FilterSortPipe implements PipeTransform {
        /**
         * 數(shù)組過濾與排序
         * @param array 原始數(shù)組
         * @param keyword 過濾關鍵詞(可選)
         * @param sortField 排序字段(可選)
         * @param direction 排序方向(默認asc)
         * @returns 處理后的數(shù)組
         */
        transform<T extends Record<string, any>>(
          array: T[],
          keyword?: string,
          sortField?: keyof T,
          direction: SortDirection = 'asc'
        ): T[] {
          // 1. 處理空數(shù)組
          if (!Array.isArray(array)) return [];
          
          // 2. 過濾邏輯:匹配任意字符串字段
          let result = [...array]; // 復制數(shù)組避免修改原始數(shù)據(jù)
          if (keyword) {
            const lowerKeyword = keyword.toLowerCase();
            result = result.filter(item => 
              Object.values(item).some(
                val => String(val).toLowerCase().includes(lowerKeyword)
              )
            );
          }
          
          // 3. 排序邏輯
          if (sortField) {
            result.sort((a, b) => {
              if (a[sortField] < b[sortField]) return direction === 'asc' ? -1 : 1;
              if (a[sortField] > b[sortField]) return direction === 'asc' ? 1 : -1;
              return 0;
            });
          }
          
          return result;
        }
      }
      

      使用示例:

      <!-- 過濾關鍵詞"張三",按age降序排序 -->
      @for (user of users | filterSort:'張三':'age':'desc'; track user.id) {
        <p>{{ user.name }} - {{ user.age }}</p>
      }
      

      2.3 非純管道:依賴外部狀態(tài)的轉換

      非純管道(pure: false)適用于依賴外部狀態(tài)(如服務數(shù)據(jù)、動態(tài)配置)的場景,但需注意性能影響(每次變更檢測都會重新計算)。以基于權限的文本過濾管道為例:

      步驟1:創(chuàng)建權限服務

      // auth.service.ts
      import { Injectable, signal } from '@angular/core';
      
      @Injectable({ providedIn: 'root' })
      export class AuthService {
        // 信號:當前用戶權限
        userPermissions = signal<string[]>(['read', 'edit']);
        
        // 檢查是否有權限
        hasPermission(permission: string): boolean {
          return this.userPermissions().includes(permission);
        }
      }
      

      步驟2:實現(xiàn)非純管道

      // permissionFilter.pipe.ts
      import { Pipe, PipeTransform, Inject } from '@angular/core';
      import { AuthService } from './auth.service';
      
      @Pipe({
        name: 'permissionFilter',
        standalone: true,
        pure: false // 標記為非純管道
      })
      export class PermissionFilterPipe implements PipeTransform {
        constructor(private authService: AuthService) {} // 注入權限服務
        
        /**
         * 基于權限過濾內容
         * @param content 原始內容
         * @param requiredPermission 所需權限
         * @param fallback 無權限時的替代文本
         * @returns 有權限顯示原始內容,否則顯示替代文本
         */
        transform(
          content: string,
          requiredPermission: string,
          fallback: string = '無權限查看'
        ): string {
          // 依賴外部服務判斷權限
          return this.authService.hasPermission(requiredPermission) 
            ? content 
            : fallback;
        }
      }
      

      步驟3:使用非純管道

      @Component({
        selector: 'app-sensitive-data',
        standalone: true,
        imports: [PermissionFilterPipe],
        template: `
          <!-- 需delete權限查看完整內容 -->
          <p>敏感信息:{{ sensitiveText | permissionFilter:'delete' }}</p>
          
          <!-- 自定義無權限提示 -->
          <p>財務數(shù)據(jù):{{ financialData | permissionFilter:'view:finance':'請聯(lián)系管理員獲取權限' }}</p>
        `
      })
      export class SensitiveDataComponent {
        sensitiveText = '用戶密碼:123456(加密存儲)';
        financialData = 'Q3營收:1000萬元';
      }
      

      3. 高級技巧:管道與Angular v20新特性結合

      Angular v20的Signals、獨立組件等特性為管道帶來了更靈活的使用方式,尤其在響應式數(shù)據(jù)處理和性能優(yōu)化上有顯著提升。

      3.1 管道與Signals的協(xié)同

      管道可直接在computed信號中使用,實現(xiàn)響應式數(shù)據(jù)轉換,且能利用Signals的依賴追蹤特性優(yōu)化性能:

      import { Component, computed, signal } from '@angular/core';
      import { PhoneMaskPipe } from './phoneMask.pipe';
      
      @Component({
        selector: 'app-signal-pipe',
        standalone: true,
        imports: [PhoneMaskPipe],
        template: `<p>脫敏手機號:{{ maskedPhone() }}</p>`
      })
      export class SignalPipeComponent {
        // 原始信號數(shù)據(jù)
        rawPhone = signal('13987654321');
        
        // 計算信號:結合管道轉換數(shù)據(jù)
        maskedPhone = computed(() => {
          // 直接調用管道的transform方法
          const pipe = new PhoneMaskPipe();
          return pipe.transform(this.rawPhone(), 4); // 保留4位前綴
        });
        
        // 更新原始數(shù)據(jù),計算信號自動重新轉換
        updatePhone(newPhone: string) {
          this.rawPhone.set(newPhone);
        }
      }
      

      3.2 管道的鏈式調用

      多個管道可通過|串聯(lián)使用,形成數(shù)據(jù)轉換流水線,注意順序需符合邏輯(先過濾后格式化):

      <!-- 鏈式調用:先過濾關鍵詞,再脫敏手機號 -->
      @for (user of users | filterSort:'北京':'name' | slice:0:3; track user.id) {
        <p>{{ user.name }} - {{ user.phone | phoneMask }}</p>
      }
      

      解析:

      1. filterSort:'北京':'name':過濾出包含"北京"的用戶,并按name升序排序
      2. slice:0:3:截取前3條數(shù)據(jù)
      3. phoneMask:對手機號進行脫敏處理

      在 Angular v20 + 環(huán)境下,管道與獨立組件、信號(Signals)的協(xié)同使用成為新趨勢:非純管道可通過信號實現(xiàn)精準更新,獨立管道則支持按需導入減少打包體積。未來開發(fā)中,需平衡管道的功能性與性能,避免將過重的業(yè)務邏輯放入管道,讓其真正成為輕量、高效的數(shù)據(jù)轉換工具。

      posted @ 2025-09-21 18:19  S&L·chuck  閱讀(11)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 玉环县| 欧美激情 亚洲 在线| 亚洲夂夂婷婷色拍WW47| 女人被狂躁到高潮视频免费软件| 污污网站18禁在线永久免费观看| 亚洲av区一区二区三区| 亚洲人成人伊人成综合网无码| 欧美日韩中文字幕久久伊人| 国产国亚洲洲人成人人专区| 久久se精品一区精品二区国产| 清镇市| 性一交一乱一乱一视频| 亚洲欧美另类激情综合区蜜芽 | 又湿又紧又大又爽A视频男| 国产精品午夜福利精品| 丁香婷婷在线观看| 悠悠人体艺术视频在线播放| 全免费A级毛片免费看无码| 少妇无套内谢免费视频| 久久九九久精品国产免费直播| 韩国av无码| 少妇无套内射中出视频| 亚洲精品福利一区二区三区蜜桃| 中文字幕在线不卡一区二区| 国产一区二区一卡二卡| 国产精品亚洲五月天高清| 在线视频不卡在线亚洲| 东京一本一道一二三区| 色综合欧美亚洲国产| 国产成人精品97| 成人性生交片无码免费看| 国产精品偷乱一区二区三区| 亚洲国产中文字幕在线视频综合| 四虎影视www在线播放| 午夜久久水蜜桃一区二区| 人妻少妇久久中文字幕一区二区 | 久久中文字幕日韩无码视频| 永久无码天堂网小说区| 乱老年女人伦免费视频| 黑人大战欲求不满人妻| 国产精品国产精品一区精品|