news 2026/5/1 9:02:17

Angular交互核心02,管道 Pipe 入门:玩转内置管道与自定义管道

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Angular交互核心02,管道 Pipe 入门:玩转内置管道与自定义管道

在 Angular 开发中,管道(Pipe)是一个核心且实用的特性,它能帮助我们在模板中简洁地转换数据格式,无需修改组件逻辑即可实现数据的格式化、过滤、转换等操作。本文将从管道的基础概念入手,详解 Angular 内置的常用管道(DatePipe、UpperCasePipe),并手把手教你创建自定义管道,让你快速掌握管道的使用技巧。

一、Angular 管道是什么?

管道本质上是一个纯函数(默认),它接收输入值,经过一系列处理后返回转换后的值。在 Angular 模板中,通过|符号(管道操作符)调用,语法格式为:

{{ 输入值 | 管道名: 参数1: 参数2:... }}

管道的核心优势在于复用性简洁性:一个管道可以在多个组件模板中调用,避免重复编写数据转换逻辑;同时模板中的写法直观易懂,降低代码冗余。

二、常用内置管道:开箱即用的便捷工具

Angular 内置了数十种管道,覆盖了日常开发中常见的数据转换场景,这里重点讲解最常用的DatePipe(日期格式化)和UpperCasePipe(大写转换)。

2.1 UpperCasePipe:文本转大写

UpperCasePipe用于将字符串全部转换为大写,无需传入参数,使用极其简单。

基本使用

组件类定义字符串变量:

// app.component.ts import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { message: string = 'hello angular pipe!'; }

模板中调用管道:

<!-- app.component.html --> <p>原始文本:{{ message }}</p> <p>大写文本:{{ message | uppercase }}</p>
输出结果
原始文本:hello angular pipe! 大写文本:HELLO ANGULAR PIPE!

2.2 DatePipe:日期格式化

DatePipe是处理日期的核心管道,支持多种日期 / 时间格式,可通过参数指定输出样式,参数格式遵循 Angular 的日期格式规则(也兼容 Unicode CLDR 格式)。

基本语法
{{ 日期值 | date: '格式字符串': '时区': '语言代码' }}
  • 格式字符串:可选,默认值为medium(如Sep 1, 2025, 12:30:45 PM);
  • 时区:可选,如GMT+8Asia/Shanghai
  • 语言代码:可选,如zh-CN(中文)、en-US(英文)。
常用格式示例

组件类定义日期变量:

// app.component.ts export class AppComponent { currentTime: Date = new Date(); // 当前时间 birthday: Date = new Date(2000, 5, 18); // 自定义日期(月份从0开始,5代表6月) }

模板中调用不同格式的 DatePipe:

<!-- app.component.html --> <!-- 默认格式(medium) --> <p>默认日期格式:{{ currentTime | date }}</p> <!-- 短日期格式 --> <p>短日期:{{ currentTime | date: 'shortDate' }}</p> <!-- 自定义格式(年-月-日 时:分:秒) --> <p>自定义格式:{{ currentTime | date: 'yyyy-MM-dd HH:mm:ss' }}</p> <!-- 指定时区和语言(中文) --> <p>中文+上海时区:{{ birthday | date: 'yyyy年MM月dd日': 'Asia/Shanghai': 'zh-CN' }}</p>
输出结果(示例)
默认日期格式:Jan 4, 2026, 10:20:30 AM 短日期:1/4/26 自定义格式:2026-01-04 10:20:30 中文+上海时区:2000年06月18日
DatePipe 常用格式符
格式符说明示例
yyyy4 位年份2026
MM2 位月份(补 0)01
dd2 位日期(补 0)04
HH24 小时制小时(补 0)10
mm分钟(补 0)20
ss秒(补 0)30
EEEE星期全称(中文)星期日

三、自定义管道:满足个性化需求

当内置管道无法满足业务需求时(比如金额格式化、手机号脱敏、数组过滤等),我们可以创建自定义管道。自定义管道需要遵循以下步骤:

3.1 步骤 1:创建管道文件

使用 Angular CLI 快速创建管道(以 “手机号脱敏管道” 为例):

ng generate pipe pipes/phone-mask # 简写:ng g pipe pipes/phone-mask

执行后会生成两个文件:phone-mask.pipe.ts(管道逻辑)和phone-mask.pipe.spec.ts(测试文件),同时管道会自动注册到模块的declarations数组中。

3.2 步骤 2:实现管道逻辑

自定义管道需要实现PipeTransform接口,并重写transform方法(核心逻辑)。transform方法接收两个参数:

  • value:需要转换的原始值;
  • args:可选参数,模板中传入的参数列表。

修改phone-mask.pipe.ts

// phone-mask.pipe.ts import { Pipe, PipeTransform } from '@angular/core'; // @Pipe装饰器:定义管道名称(模板中使用的名称) @Pipe({ name: 'phoneMask' // 管道名:phoneMask }) export class PhoneMaskPipe implements PipeTransform { /** * 手机号脱敏转换 * @param value 原始手机号(如13812345678) * @param args 可选参数:脱敏占位符(默认*) * @returns 脱敏后的手机号(如138****5678) */ transform(value: string, args: string = '*'): string { // 校验:非11位手机号直接返回原数据 if (!value || value.length !== 11 || !/^1[3-9]\d{9}$/.test(value)) { return value; } // 脱敏逻辑:保留前3位和后4位,中间4位替换为占位符 return value.replace(/(\d{3})\d{4}(\d{4})/, `$1${args.repeat(4)}$2`); } }

3.3 步骤 3:在模板中使用自定义管道

组件类定义手机号变量:

// app.component.ts export class AppComponent { phone1: string = '13812345678'; // 合法手机号 phone2: string = '123456'; // 非法手机号 }

模板中调用自定义管道:

<!-- app.component.html --> <p>原始手机号1:{{ phone1 }}</p> <p>脱敏手机号1(默认*):{{ phone1 | phoneMask }}</p> <p>脱敏手机号1(自定义#):{{ phone1 | phoneMask: '#' }}</p> <p>非法手机号:{{ phone2 | phoneMask }}</p>

3.4 步骤 4:查看输出结果

原始手机号1:13812345678 脱敏手机号1(默认*):138****5678 脱敏手机号1(自定义#):138####5678 非法手机号:123456

3.5 自定义管道进阶:多参数示例

如果需要传入多个参数(比如 “金额格式化管道”,支持指定小数位数和货币符号),修改transform方法即可:

// money-format.pipe.ts @Pipe({ name: 'moneyFormat' }) export class MoneyFormatPipe implements PipeTransform { // value:金额数字;decimalDigits:小数位数;symbol:货币符号 transform(value: number, decimalDigits: number = 2, symbol: string = '¥'): string { if (isNaN(value)) return '0.00'; // 格式化数字为指定小数位数 const formattedNum = value.toFixed(decimalDigits); // 添加货币符号 return `${symbol}${formattedNum}`; } }

模板中调用(多参数用冒号分隔):

<p>原始金额:{{ 1234.567 }}</p> <p>默认格式化:{{ 1234.567 | moneyFormat }}</p> <p>保留1位小数+美元:{{ 1234.567 | moneyFormat: 1: '$' }}</p>

输出:

原始金额:1234.567 默认格式化:¥1234.57 保留1位小数+美元:$1234.6

四、管道的核心特性:纯管道与非纯管道

默认情况下,Angular 管道是纯管道(Pure Pipe),只有当输入值(valueargs)的引用发生变化时,管道才会重新执行transform方法。这意味着:

  • 对于基本类型(字符串、数字、布尔):值变化时触发重新计算;
  • 对于引用类型(对象、数组):只有引用地址变化(如重新赋值)才触发,修改对象属性 / 数组元素不会触发。

如果需要监听引用类型的内部变化(比如实时过滤数组),可以将管道设置为非纯管道(Impure Pipe)

@Pipe({ name: 'filterArray', pure: false // 非纯管道 })

⚠️ 注意:非纯管道会在每次变更检测时执行,可能影响性能,需谨慎使用!

五、总结

Angular 管道是模板中数据转换的 “利器”:

  1. 内置管道UpperCasePipeLowerCasePipeDatePipeCurrencyPipe等能满足大部分基础场景,无需重复造轮子;
  2. 自定义管道:通过实现PipeTransform接口,可快速封装个性化的转换逻辑,提升代码复用性;
  3. 性能注意:优先使用纯管道,非纯管道需评估性能影响。

掌握管道的使用和自定义技巧,能让你的 Angular 模板更简洁、逻辑更清晰,大幅提升开发效率。快去尝试用管道优化你的项目吧!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:08:42

高性能编程的秘密武器(C# Span深度实战解析)

第一章&#xff1a;高性能编程的基石——理解Span的核心价值在现代高性能编程中&#xff0c;内存管理与数据访问效率成为决定系统吞吐量的关键因素。Span 作为 .NET 中引入的一种轻量级、堆栈分配的结构体类型&#xff0c;为开发者提供了安全且高效的内存抽象能力。它能够在不触…

作者头像 李华
网站建设 2026/5/1 5:00:20

Java小白求职面试:从Spring Boot到微服务的技术深度探讨

场景&#xff1a;互联网大厂Java小白求职者面试 人物介绍&#xff1a; 面试官&#xff1a;一位严肃但经验丰富的技术专家。超好吃&#xff1a;Java小白求职者&#xff0c;刚毕业&#xff0c;充满求知欲。 第一轮提问&#xff1a;Spring Boot及Web框架 面试官&#xff1a;超好吃…

作者头像 李华
网站建设 2026/5/1 6:16:13

C#跨平台日志收集实战(日志架构设计大揭秘)

第一章&#xff1a;C#跨平台日志收集实战&#xff08;日志架构设计大揭秘&#xff09;在构建现代分布式系统时&#xff0c;统一的日志收集与分析能力是保障系统可观测性的核心。C# 作为主流后端开发语言之一&#xff0c;借助 .NET 的跨平台能力&#xff0c;可在 Windows、Linux…

作者头像 李华
网站建设 2026/5/1 7:33:29

HeyGem单个处理模式快速上手指南,轻松生成AI数字人视频

HeyGem单个处理模式快速上手指南&#xff0c;轻松生成AI数字人视频 在短视频内容爆发的今天&#xff0c;越来越多的企业和个人希望用“数字人”来制作讲解视频、课程录播或产品宣传。但传统方式要么成本高昂——需要请真人出镜、专业拍摄剪辑&#xff1b;要么技术门槛太高——…

作者头像 李华
网站建设 2026/4/25 11:40:13

基于java+ vue高校门诊管理系统(源码+数据库+文档)

高校门诊管理 目录 基于springboot vue高校门诊管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue高校门诊管理系统 一、前言 博主介绍&…

作者头像 李华