[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.mzph.cn/news/589063.shtml

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

相关文章

代码随想Day53 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 本题和 718. 最长重复子数组 的区别就是本题不要求连续&#xff0c;所以在两个字符不相等的时候&#xff0c;逻辑不相同&#xff0c;当不相同的时候&#xff0c;需要找到dp[i-1][j]和dp[i][j-1]之间的最大值&#xff0c;因为不相等的时候需要找出退而求上…

【python爬虫】xpath使用说明

XPath 可以在XML文档中查找信息,支持HTML,可以用来提取信息。可以把标签文本看作一个树状图&#xff0c;最顶层是html&#xff0c;第二层是head和body&#xff0c;body的下面是许多div&#xff0c;每个div可以用/[属性属性名]来进一步细分&#xff0c;也可以通过/属性来获取对应…

Debezium日常分享系列之:重新选择列

Debezium系列之&#xff1a;重新选择列 一、介绍 仅 SQL 数据库连接器支持此后处理器。在某些情况下&#xff0c;由于某些源数据库的工作方式&#xff0c;当 Debezium 连接器发出更改事件时&#xff0c;该事件可能会排除特定列类型的值。例如&#xff0c;PostgreSQL 中的 TOA…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

Docker九 | Swarm mode

目录 Swarm基本概念 节点 服务和任务 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 Swarm基本概念 节点 节点分为管理节点(manager)和工作节点(worker) 管理节点 管理节点用于Swarm集群的…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPISDK获…

Django 学习教程-介绍与安装

系列 Django 学习教程-第一个 Django 应用-CSDN博客 介绍 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。 它由经验丰富的开发人员构建&#xff0c;解决了 Web 开发的大部分麻烦&#xff0c;因此您可以专注于在编写应用程序时无需重新发…

自定义事件

自定义事件 自定义事件 AAA"fn1"&#xff1a;向子组件的事件池中注入AAA事件&#xff0c;方法是父组件的fn1 发布订阅&#xff1a;子组件某个操作把父组件中的某个方法执行了 参数可以传多个 $listeners* $listeners&#xff1a;事件池中的方法 { aaa:fn1, bbb:fn2 }…

RestClient操作索引库_创建索引库(二)

ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c; 通过http请求发送给ES。 官方文档地址: https://www.elastic.co/quide/en/elasticsearch/client/index.html 目录 一、初始化JavaRestClient 1.1.依赖引入 1.2.初始化…

关于k8s

Kubernetes&#xff08;通常被称为K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由Google开发&#xff0c;并于2014年发布为开源项目&#xff0c;现在由云原生计算基金会&#xff08;CNCF&#xff09;负责维护。 Kub…

JS-图片预览

方法一 用URL.createObjectURL()将一个file或Blob类型的对象转为UTF-16的字符串 objectURL URL.createObjectURL(Fileobject); URL.createObjectURL()静态方法会创建一个 DOMString&#xff0c;其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中…

java代码配置连接OPCUA

pom依赖如下 <dependency><groupId>org.eclipse.milo</groupId><artifactId>sdk-client</artifactId><version>0.6.9</version> </dependency><dependency><groupId>org.eclipse.milo</groupId><artifa…

举例说明计算机视觉(CV)技术的优势和挑战

高效性&#xff1a;计算机视觉技术可以处理大量的图像和视频数据&#xff0c;并快速地从中提取有用的信息。它可以在几秒钟内完成复杂的图像处理任务&#xff0c;而这些任务对于人类来说可能需要很长时间才能完成。精确性&#xff1a;计算机视觉技术可以准确地识别和分析图像中…

Mybatis枚举类型处理和类型处理器

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

C++ 具名要求-基本概念-指定该类型对象可以默认构造

指定该类型对象可以默认构造 要求 以下情况下&#xff0c;类型 T 满足可默认构造 (DefaultConstructible) &#xff1a; 给定 任意标识符 u&#xff0c; 下列表达式必须合法且拥有其指定的效果 表达式后条件T u对象 u 被默认初始化。T u{}对象 u 被值初始化或聚合初始化。…

MySQL之复合查询

目录 单表查询回顾 多表查询 自连接 子查询 在from子句中使用子查询 合并查询 单表查询回顾 在讲解多表查询前&#xff0c;我们先回顾一下单表查询&#xff0c;这是因为多表查询本质上依然是单表查询&#xff08;其原因在下文中讲解多表查询时再说明&#xff09;&#x…

【vue】Easy Player实现视频播放:

文章目录 一、效果&#xff1a;二、文档&#xff1a;三、实现&#xff1a;【1】安装插件&#xff1a;【2】引入js文件&#xff1a;【3】使用&#xff1a; 四、方法&#xff1a; 一、效果&#xff1a; 二、文档&#xff1a; GitCode - EasyPlayer.js npm-easydarwin/easyplayer…

uni-app 前后端调用实例 基于Springboot 下拉刷新实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

关于“Python”的核心知识点整理大全54

目录 18.4 创建其他网页 18.4.1 模板继承 1. 父模板 base.html 注意 2. 子模板 index.html 注意 18.4.2 显示所有主题的页面 1. URL模式 urls.py 2. 视图 views.py 3. 模板 topics.html 18.4.3 显示特定主题的页面 1. URL模式 urls.py 2. 视图 views.py 往…

Delphi6函数大全3-SysUtils.pas

Delphi6函数大全3-SysUtils.pas首部 function FindNext(var F: TSearchRec): Integer; $[SysUtils.pas功能 返回继续文件搜索说明 搜索成功则返回0参考 function Windows.FindNextFile例子 <参见FindFirst>━━━━━━━━━━━━━━━━━━━━━首部…