[Angular] 笔记 25:指令

组件指令 (chatgpt 回答)

在 Angular 中,组件本身可以被视为指令,这种指令被称为组件指令。组件是 Angular 应用的构建块之一,它封装了一段具有特定功能和特性的用户界面,并且可以在应用中重复使用。

组件指令具有以下特征:

  1. 封装性:组件指令封装了一段具有特定功能的用户界面,并且可以通过标签形式在其他组件模板中被重复使用。

  2. 模板:每个组件都有一个关联的模板,用于定义组件的视图结构和布局。

  3. 逻辑:组件指令也包含了与视图相关的业务逻辑,包括数据处理、事件处理等。

  4. 可复用性:组件可以被多次实例化,并且可以在应用中的不同位置重复使用。

  5. 生命周期钩子:组件指令可以利用 Angular 的生命周期钩子来执行特定的操作,比如在组件初始化、销毁、数据变化等时刻执行特定的逻辑。

  6. 元数据:每个组件都有与之相关联的元数据,包括选择器、模板、样式、输入和输出属性等。

请比较 Angular 中的三种指令: 组件指令,结构型指令和属性型指令

当谈论 Angular 中的指令时,有三种主要类型:组件指令、结构型指令和属性型指令。它们在功能和使用方式上有所不同:

组件指令(Component Directives):
功能: 组件指令是 Angular 中的组件,它们有自己的模板、样式和逻辑,并被用来构建用户界面的独立部分。
使用: 使用 @Component 装饰器来定义组件,并且通过类和模板组合在一起。组件可以通过选择器被引用并在应用中使用。
示例@Component({ ... }) class MyComponent { ... }

结构型指令(Structural Directives):
功能: 结构型指令用于改变 DOM 结构,根据条件添加、删除或替换 DOM 元素。它们不会创建新组件,而是操作现有的 DOM 元素。
使用: 结构型指令通过 * 前缀标识,常见的有 *ngIf*ngFor*ngSwitch 等。它们基于条件来操作 DOM 元素的显示和隐藏,循环生成元素或根据条件选择要渲染的元素。
示例<div *ngIf="condition">...</div>

属性型指令(Attribute Directives):
功能: 属性型指令用于改变现有 DOM 元素的外观或行为,而不会改变 DOM 结构。
使用: 属性型指令以 [directiveName] 的形式应用于 HTML 元素,常见的有 ngClassngStylengModel 等。它们通过操作元素的属性或添加特定的行为来改变元素的外观或行为。
这三种指令在 Angular 应用中发挥着不同的作用:组件指令用于创建可复用的组件,结构型指令用于改变 DOM 结构,属性型指令用于操作元素的外观和行为。


Angular For Beginners - 30. Directives

Angular 常见面试问题:组件和指令之间的区别是什么?
组件拥有视图,即 View,或者说 HTML 元素。

在这里插入图片描述

如果有一所房屋的话,结构型指令会修改房屋的实际结构,它会给房屋搭框架,会给房屋盖屋顶。
在这里插入图片描述

而属性型指令会粉刷房子。
在这里插入图片描述

自定义指令 ( custom directive)

自定义指令分两种:自定义结构性指令和自定义属性型指令。

1. 新建两条指令

  1. 在 app 里新建文件夹_directives,

  2. 然后右键 -> Generate Directive, 指令名称设为 customif , _directives 文件夹下将会生成两个文件,customif 将是一个结构型指令。

  3. 再次右键 -> Generate Directive, 指令名称设为 highlighttext , _directives 文件夹下总共会有4个文件,highlighttext 将是一个属性型指令。

在这里插入图片描述

2. 设置指令 highlighttext

highlighttext.directive.ts:

import { Directive, ElementRef, HostListener } from '@angular/core';@Directive({// selector: '[appHighlighttext]',selector: '[highlighttext]',
})
export class HighlighttextDirective {// 使用 ElementRefconstructor(private el: ElementRef) {// better -> use Renderer2, which will be the safer version}// new code@HostListener('mouseenter') onMouseEnter() {this.el.nativeElement.style.backgroundColor = 'blue';}// new code@HostListener('mouseleave') onMouseLeave() {this.el.nativeElement.style.backgroundColor = 'purple';}
}

pokemon-base.module.ts:

@NgModule({declarations: [PokemonListComponent,PokemonDetailComponent,PokemonTemplateFormComponent, HighlighttextDirective, // 新增代码],imports: [CommonModule,HttpClientModule,FormsModule, RouterModule.forChild(routes), ],exports: [PokemonListComponent, PokemonDetailComponent],providers: [PokemonService],bootstrap: [HighlighttextDirective] // 新增代码
})
export class PokemonBaseModule {}

pokemon-list.component.html:

<table><thead><th #pokemonTh>Name</th><th>Index</th></thead><tbody><app-pokemon-detail#pokemonRef*ngFor="let pokemon of pokemons"[detail]="pokemon"(remove)="handleRemove($event)"></app-pokemon-detail></tbody><!-- 测试 highlighttext 指令 --><div highlighttext>This is highlighttext</div>
</table>

3. 测试 highlighttext 指令

鼠标移到新增 <div> 上面,紫色会变成蓝色,highlighttext 指令正常工作:

在这里插入图片描述

4. 设置指令 customif

pokemon-list.component.html:

<table><thead><th #pokemonTh>Name</th><th>Index</th></thead><tbody><app-pokemon-detail#pokemonRef*ngFor="let pokemon of pokemons"[detail]="pokemon"(remove)="handleRemove($event)"></app-pokemon-detail></tbody><div highlighttext>This is highlighttext</div><!-- 测试 customif 指令 --><h2 *customif="true">This is true</h2><h2 *customif="false">This is false</h2>
</table>

<h2> 在底层其实是一个 <ng-template>,所以<h2> 在这里相当于是一个 <ng-template>

customif.directive.ts:

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';@Directive({// selector: '[appCustomif]'selector: '[customif]',
})
export class CustomifDirective {@Input() customif: boolean = false;constructor(private templateRef: TemplateRef<any>,private vcr: ViewContainerRef) {}ngOnInit(): void {if (this.customif) {this.vcr.createEmbeddedView(this.templateRef);} else {this.vcr.clear();}}
}

pokemon-base.module.ts:

@NgModule({declarations: [PokemonListComponent,PokemonDetailComponent,PokemonTemplateFormComponent,HighlighttextDirective,CustomifDirective, // 新增 CustomifDirective],imports: [CommonModule,HttpClientModule,FormsModule,RouterModule.forChild(routes),],exports: [PokemonListComponent, PokemonDetailComponent],providers: [PokemonService],bootstrap: [HighlighttextDirective, CustomifDirective], // 新增 CustomifDirective
})
export class PokemonBaseModule {}

5. 测试指令 customif

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/312418.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习SpringCloud微服务

SpringCloud 微服务单体框架微服务框架SpringCloud微服务拆分微服务差分原则拆分商品服务拆分购物车服务拆分用户服务拆分交易服务拆分支付服务服务调用RestTemplate远程调用 微服务拆分总结 服务治理注册中心Nacos注册中心服务注册服务发现 OpenFeign实现远程调用快速入门引入…

TiDB SQL调优案例TiFlash

背景 早上收到某系统的告警tidb节点挂掉无法访问&#xff0c;情况十万火急。登录中控机查了一下display信息&#xff0c;4个TiDB、Prometheus、Grafana全挂了&#xff0c;某台机器hang死无法连接&#xff0c;经过快速重启后集群恢复&#xff0c;经排查后是昨天上线的某个SQL导…

python安装MongoDB与运算符优先级

python安装MongoDB MongoDB 是目前最流行的 NoSQL 数据库之一&#xff0c;使用的数据类型 BSON&#xff08;类似 JSON&#xff09;。 PyMongo Python 要连接 MongoDB 需要 MongoDB 驱动&#xff0c;这里我们使用 PyMongo 驱动来连接。 pip 安装 pip 是一个通用的 Python 包…

HTTP小记2

目录 HTTP/1.1优化 QUIC协议 路由器 RTT&#xff08;Round-Trip Time&#xff09; 计算机网络体系结构 体系结构各层在整个过程中的作用 HTTP/1.1优化 1.通过缓存技术来避免/减少发送HTTP请求 2.减少HTTP请求的次数 将原本由客户端处理的重定向请求&#xff0c;交给代理…

面向对象基础-类与对象-封装

1、类与对象 1.1 概念 类&#xff1a;类是一个抽象的概念&#xff0c;用于描述一类对象的特点。 对象&#xff1a;根据类的概念所创造的实体。 【思考】一个对象可以没有对应的类嘛&#xff1f; 不可以&#xff0c;因为必须现有类才能创建对象。 1.2 类的内容 类中最基础的内容…

git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作)

文章目录 1. Git概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git简史1.5 Git工作机制1.6 Git和代码托管中心 2. Git安装3. Git常用命令3.1 设置用户签名3.1.1 说明3.1.2 语法3.1.3 案例实操 3.2 初始化本地库3.2.1 基本语法3.2.2 案例实操3.2.3 结果查看 3…

LDO线性稳压器与开关电源的原理

线性稳压器LDO典型代表&#xff1a;LM7805 ,AMS1117&#xff0c;还有一下性能比较好的LDO&#xff1a; 开关稳压器典型代表&#xff1a;LM2596&#xff0c;MP1584,TPS5430&#xff0c;MP2315S LDO靠发热分散能量&#xff0c;纹波较小一般在30mv以下&#xff1b;DCDC通过开关开断…

SpringBoot实用篇

SpringBoot实用篇 1、热部署 什么是热部署&#xff1f; 所谓热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。对于Java应用程序来说&#xff0c;热部署就是在运行时更新Java类文件。 热部署有什么用&#xff1f; 节约时间&#xff0c;热…

Redis 数据结构和常用命令

* 代表多个&#xff0c;&#xff1f;代表一个 &#xff08;不用全部敲出来&#xff0c;按住tab可以自动补全&#xff09; -2是无效&#xff0c;-1是永久有效 &#xff1b;贴心小提示&#xff1a;内存非常宝贵&#xff0c;对于一些数据&#xff0c;我们应当给他一些过期时间&a…

《Python机器学习原理与算法实现》学习笔记

以下为《Python机器学习原理与算法实现》&#xff08;杨维忠 张甜 著 2023年2月新书 清华大学出版社&#xff09;的学习笔记。 根据输入数据是否具有“响应变量”信息&#xff0c;机器学习被分为“监督式学习”和“非监督式学习”。 “监督式学习”即输入数据中即有X变量&…

nodejs+vue+微信小程序+python+PHP技术的健康信息网站-计算机毕业设计推荐

3.2 功能性需求分析 健康信息网站为会员提供健康信息服务的系统&#xff0c;管理员通过登录系统&#xff0c;管理会员信息、健康咨询、健康知识、健康档案、健康养生、健康信息的搜索、健康资讯等。需要学习的会员浏览健康信息网站&#xff0c;查询所有的健康信息&#xff0c;可…

磁盘阵列raid

一、服务器硬件 cpu 、 主板 、内存、硬盘、网卡、电源、raid卡、风扇、远程管理卡 二、硬盘尺寸 目前生产环境中主流的两种类型硬盘 3.5寸 和 2.5寸 硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器&#xff0c;但是3.5寸没法转换成2.5寸 1.如何在服务器上…