Angular学习(二)【组件】

Vue事件总线(EventBus)、$on、$emit、$off 在之前我们只用过父传子,子传父进行传数据,这时候当组件嵌套比较深或比较复杂的情况,这时候就用到了事件总线 (EventBus) 如何理解事件总线呢,你可以理解为用来传输数据的一条线 一、使用EventBus 1. 创建事件总线 main.js // 创建事件总线 const bus = new Vue() // 把bus挂载到了Vue的原型上, 保证所有的组件都能通过 this.$bus访问到事件总线 Vue.prototype.$bus = bus 2.页面使用 发布事件 - 传... 阅读详情

组件

前端中的组件是一堆为了实现同一业务逻辑的代码文件的组合,将相关文件都放到同一个目录中,就形成了一个独立性非常强的组件。

Angular 中使用了Web Component 的标准来实现组件化。

组件是 Angular 应用的最小的逻辑单元,模块则是在组件之上的一层抽象。组件以及其他部分,如指令、管道、服务、路由等都可以被包含到一个模块中,外部通过引用这个模块来使用一系列封装好的功能。

可以把 Angular 应用想象成一棵树,模块是这棵树的树枝,组件是这棵树的叶子,每个 Angular 应用都必须要有一个根模块(树干),并且根模块中必须通过 Bootstrap 指定根组件,用于启动 Angular 应用。

创建组件

创建组件跟简单,可以通过一下三个步骤创建组件:

  1. 从 @angular/core 中引入 Component 装饰器;
  2. 建立一个普通的类,并用 @Component 修饰它;
  3. 在 @Component 中,设置 selector 自定义标签和 template/templateUrl 模板以及 styles/styleUrls 样式。
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent { }

在新版的 Angular 中自定义标签需要以 app- 开头,否则会报错。

以上代码会创建一个最简单的 Angular 组件,使用这个组件需要在 HTML 中添加 <app-root></app-root> 标签,然后 Angular 便会在此标签中插入组件中指定的模板。

组件的基础构成

组件由组件装饰器、组件元数据、模板和组件类组成。先来了解一下组件装饰器和组件类,后面有章节详细说明组件元数据和模板。

组件装饰器( Component Decorator )

每个组件类必须使用 @Component 进行修饰才能成为 Angular 组件; @Component 是 TypeScript 的语法,它是一个装饰器,任何一个 Angular 的组件都会用这个装饰器修饰,如果移除了这个装饰器,它将不再是 Angular 组件了。

组件类

组件实际上也是一个普通的类,组件的逻辑都在组件类里定义并实现。


组件元数据

在组件中的 @Component 装饰器部分,提供了额外的元数据以确定如何在运行时处理、实例化和使用组件:

  • selector:用于定义组件标签名,也是此组件的元素选择器;
  • template:定义组件宿主元素的模板;
  • templateUrl:引用外联模板;
  • styles:要应用于此组件视图的内联定义样式;
  • styleUrls:要应用于此组件视图的外联样式表;
  • animations:此组件的动画列表;
  • providers:此组件及其子组件可用的 providers 列表;
  • viewProviders:此组件及其视图子项可用的 providers 列表;
  • exportAs:在模板中导出组件实例的名称;
  • inputs:以数据绑定为组件输入类属性名称列表;
  • moduleId:定义此组件的 ES/CommonJS 模块 ID;
  • outputs:显示其他人可以订阅的输出事件的类属性名称列表;
  • host:将类属性映射到元素绑定的事件和属性;
  • encapsulation:此组件使用的样式封装策略;
  • interpolation:在此组件模板中使用的自定义插值标记;
  • queries:配置可以注入组件的查询;
  • changeDetection: 更改此组件使用的检测策略.

每个组件只能指定一个模板,可以使用 template 或者 templateUrl 的引入方式。

styles 和 styleUrls 允许同时指定。如果同时指定,styles 中的样式会先被解析,然后才会解析 styleUrls 中的样式。


数据绑定

每个组件都会关联一个模板,这个模板最终会渲染到页面上,页面的这个 DOM 元素就是此组件实例的宿主元素;

组件是自描述的。可以与宿主元素交互,交互的形式包括:

  • 显示数据

可以再模板中使用插值语法 {{}} 来显示组件中的数据。

  • 双向数据绑定

在模板中通过形如 [(ngModel)]='property' 的方式进行双向数据绑定。

  • 监听宿主元素事件以及调用组件方法

在模板中通过形如 (click)='fun()' 的方法响应 UI 事件并调用组件中的方法。


组件的生命周期

组件的生命周期由 Angular 内部管理,从组件的创建、渲染,到数据变动事件的触发,再到组件从 DOM 中移除, Angular 都提供了一系列的钩子。这些钩子可以让开发者很方便的在这些事件触发时,执行相应的回调函数。

组件提供了八个生命周期钩子,下面分别来看一下:

ngOnChanges

ngOnint 钩子用于响应组件输入值发生变化时触发的事件。该方法接受一个 SimpleChanges 对象,包含当前值和变化前的值。该方法在ngOnint 之前,或者当数据绑定输入属性的值发生变化时会触发。

ngOnChanges 当且仅当组件输入数据变化时被调用,这里的“输入数据”指的是通过 @Input 装饰器显式指定的那些变量。只要这个输入属性的值发生了改变.就会触发 ngOnChanges() 生命周期钩子.这个生命周期钩子被调用时会传入一个 SimpleChanges 对象,这个对象中包含了输入属性当前值和上一值。

@Input() name: string;
ngOnChanges(changes: SimpleChanges): void {
  console.log(changes); // name:SimpleChange {previousValue: "a", currentValue: "ab", firstChange: false}
}

上面是定义了一个输入属性name并将从a它改为ab之后的打印结果,可能你还注意到了打印的结果中还有一个firstChange属性.它是一个Booleans,表明你是否是第一次改变。

同时,还有一点需要注意: 输入属性定义为引用类型和基本类型的时候其表现结果是不同的.当输入属性是基本类型时,每一次改变都会触发 ngOnChanges() 生命周期钩子,而当输入属性是引用类型时,改变引用类型 当中 的属性时,并不会触发 ngOnChanges() 生命周期钩子,只有将引用类型数据的指针指向另一块内存地址的时候才会触发 ngOnChanges() 生命周期钩子。

ngOnInit

ngOnint 钩子用于数据绑定输入属性之后初始化组件。该钩子方法会在第一次 ngOnChanges 之后被调用。

使用 ngOnInit 有以下两个重要的原因:

  1. 组件构造后不久就要进行复杂的初始化;
  2. 需要在输入属性设置完成之后才构建组件。

ngDoCheck

ngDoCheck 钩子用于变化监测,该方法会在每次变化监测发生时被调用,在 ngOnChanges() 和 ngOnInit() 之后。

ngDoCheck() 是 Angular 中的变更检测机制.它由 zone.js 来实现的。其行为是只要你的 Angular 中的某个组件发生异步事件,就会检查整个组件树,以保证组件属性的变化或页面的变化是同步的,所以 ngDoCheck() 的触发相当频繁的.并且是我们无法预料到的,也许我们在页面上的一个无意识操作,就会触发几个甚至几十个的 ngDoCheck() 生命周期钩子。每一个变化监测周期内,不管数据值是否发生了变化,ngDoCheck 都会被调用,因此这个方法要慎用。所以我们在使用ngDoCheck()生命周期钩子的时候一定要加上判断.以避免无用的触发干扰我们.

ngAfterContentInit

ngAfterContentInit 钩子在组件内引用外部组件时,外部内容嵌入到组件视图后调用,它在第一次 ngDoCheck 执行后调用,且只执行一次。

当父组件向子组件投影内容的时,在子组件内会初始化父组件的投影内容,此时会调用 ngAfterContentInit() 生命周期钩子.在整个组件生命周期中只会调用一次.如下所示:

<!--- 父组件 --> 
<app-child>
  <p>我是父组件向子组件的投影内容</>
</app-child>
<!--- 子组件 ChildComponent --> 
<div>
  //接受父组件的投影内容
  <ng-content></ng-content>
</div>

ngAfterContentChecked

ngAfterContentChecked 钩子在组件内引用外部组件时,外部内容嵌入到组件视图后,或者每次变化监测的时候调用。ngAfterContentInit() 和每次 ngDoCheck() 之后调用。

当父组件向子组件的投影内容发生改变时会调用 ngAfterContentChecked() 生命周期钩子。它与 ngDoCheck() 类似,当投影内容发生改变时,就会执行变更检查机制,同时调用 ngAfterContentChecked() 生命周期钩子。此外,还有一点:当父组件和子组件都有投影内容时,会先执行父组件的生命周期钩子,它与下面要说的 ngAfterViewInit() 和 ngAfterViewChecked() 相反.

ngAfterViewInit

ngAfterViewInit 钩子会在 Angular 创建了组建的视图及其子视图之后被调用。在第一次 ngAfterContentChecked() 之后调用,只调用一次。

ngAfterViewChecked

ngAfterViewChecked 在 Angular 创建了组件的视图及其子组件视图之后被调用一次,并且在每次子组件变化监测时也会被调用。

当组件及其子组件的视图发生改变时,执行完变更检查机制后调用.当父组件和子组件都发生视图变化时,会先执行子组件的生命周期钩子.

注意: 这里所说的视图发生改变不一定是真正页面上的变化.只是Angular种所认为的视图变化.因为Angular本身并不能察觉到页面上显示的视图.所以在Angular认为,只要你在后台定义的属性发生了改变,就是视图有了变化.从而就会调用ngAfterViewChecked()生命周期钩子.

ngOnDestroy

ngOnDestroy 在销毁组件之前触发。那些不会垃圾自动回收的资源(比如已订阅的观察者事件、绑定过的 DOM 事件。通过 setTimeOut 或 setInterval 设置过得计时器等等)都应该在 ngOnDestroy 中手动销毁掉,从而避免发生内存泄漏等问题。

【Angular】学习笔记(二 服务、组件通信、生命周期) 文章目录一、 服务 service1.创建并引入 service2. service 中定义变量和方法3. 在组件中使用service定义的方法 一、 服务 service 组件不应该直接获取或保存数据,它们不应该了解是否在展示假数据。 它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务。 服务为多个“互相不知道”的类提供共享的数据及方法。 1.创建并引入 service ng g service services/storage 在app.model.ts里配置并引入 import { Stora 阅读详情

相关推荐

Angular基础(二) 组件的使用

​ 一、简单操作 a) 使用Angular CLI可以快速创建项目框架,先运行 $ npm install –g @angular/cli@1.0.0安装CLI,为CLI的位置设置环境变量,然后就可以全局使用ng命令了。 执行ng new –ng4 angular-hello-world可以创建Angular4项目,会自动生成基础的文件夹和文件,还会自动进行npm i操作,下载并安装所

zhixin9001的博客 1749

dispatch js实现_js实现对象自定义事件,触发,on监听事件的方式

Object自定义事件,自定义触发方式,on监听闭包实现:(function(scope){var listenerList = {//插件事件数组"message":function(e){console.log( e )}};var ev = {dispatch : function(eventKey){var args = Array.prototype.slice.call(argumen...

weixin_34816913的博客 2715

color-selector

颜色选择器 ProductiveMinds的适用于Android的实用颜色选择器插件 客观的 将这个简单但实​​用的插件添加到您的Android项目中,并轻松实现为将颜色应用于视图的背景和前景的颜色选择器。 安装 下载或克隆项目 在Android Studio或您喜欢的IDE中打开 根据需要添加到您的项目中。 例如,您可以导入为新模块,然后在gradle文件中进行引用。 内容 Java类 用于显示颜色选择器的布局文件 用于设计视图样式的可绘制资源 最低SDk支持= 21 ColorSelector.java类是扩展Android的Color.java的包装器类。 除非您要扩展它,否则您不太可能参考此类。 ColorSliderUi.java类-您将主要使用此类。 该类调用颜色选择器弹出窗口,并负责选择过程。 示例实施步骤 安装后,实例化并实现ColorSliderUi.java类。 下

vue中实现在子组件中刷新父组件

一、首先是父组件,现在父组件中的子组件属性上添加监听事件,signStatusVerdict 二、其次是子组件,发射一个事件给父组件的监听属性 三、最后是父组件,父组件中监听到事件后会执行listenSignStatus方法,执行更新父组件列表操作 ...

liyiliang123的博客 3848

vue 组件之间事件触发($emit)与event Bus($on)的用法说明

组件之间事件触发 之前使用组件,并不是很频繁,是水平的问题,目前工作中,公司大佬带着我手写过一个组件,再此很感谢他的指导。目前简单的组件已经有了自己的逻辑思维,正在从低级码农向中级码农蜕变。废话不多说。上图看看组件情况。 新增按钮组件: 操作按钮组合组件: 此时有个需求就是,无论是哪个按钮,如果改变了列表中的数据,列表需要实时更新数据。 此时就需要用到组件间的事件触发。 父子组件之间事件触发可以使用$emit $emit的使用方法如下: 在子组件中,写一个click点击事件。比如: cancelCU() { this.dialogVisible = false; this.$emi

物联网 Mixly-智能楼道灯

一、实验目的及要求 熟悉声音及人体红外传感器用法。 二、实验原理与内容 1.使用声音传感器实现声控灯功能。 2.使用人体红外传感器实现人体检测控制灯功能。 三、实验软硬件环境 硬件:Arduino、LED灯、声音传感器、人体红外传感器 软件:Mixly IDE 四、实验过程(实验步骤、记录、数据、分析) 核心代码截图 声控灯: 人体红外检测灯: 3.实验效果图: (1)、声控灯总线连接: (1)、声控灯声音大于一某个值时灯亮,经过2秒后灯灭: (3)、人体红外检测灯连接总线: (4)、人体红外

qq_43430810的博客 1916

Angular基础学习二(包含了组件,服务,模块,组件通信)

目录结构 components下是基本组件。 modules下是基本模块demo。 valueof是子模块,主要是父子组件间传值,利用服务传值。 app-routing.module.ts中在routes中设置路由,component设置挂载组件,loadChildren为加载子模块 子模块 school模块,下面创建了三个组件,把lesson组件配置成了teacher组件的子...

Kineone的博客 404

Cadence Allegro 17.4 保姆级教程:PCB位号重排与反标回原理图完整避坑指南

本文详细解析了Cadence Allegro 17.4中PCB位号重排与反标回原理图的全流程,包括安全工程准备、智能重排策略和反标黄金法则。特别针对芯片封装协同设计(Co-Design)场景,提供可追溯的版本管理和故障恢复方案,帮助工程师避免常见位号陷阱,确保设计文件一致性。

weixin_30613433的博客 438

Angular学习(二)组件交互的几种方式

Angular组件交互的几种方式通过@Input()从父组件传数据到子组件通过 setter 监听父组件属性值变化通过ngOnChanges()来监听输入属性值的变化通过EventEmitter监听子组件的事件在模板内父子组件通过本地变量互动通过@ViewChild()将子组件注入父组件通过服务进行父子组件通信 通过@Input()从父组件传数据到子组件 在子组件中通过 @Input() 装饰器...

紫眸的博客 880

LangChain与SkillLite集成:AI Agent安全沙箱实践

在AI与自动化技术领域,安全沙箱是实现可信计算的核心机制。其原理是通过资源隔离与权限控制,构建受限的执行环境。技术价值在于平衡功能开放性与系统安全性,尤其适用于处理用户提交的非受信代码或敏感数据。典型应用场景包括AI插件系统、在线代码评测平台等。本文以LangChain框架与SkillLite沙箱的深度集成为例,详解如何通过命名空间隔离、cgroups限制等机制,为AI Agent赋予安全执行动态技能的能力。其中涉及的关键技术点包括Python运行时隔离、动态资源配额管理,以及如何防范Shell注入等常见攻

weixin_34189116的博客 404

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1079

Angular学习之路(二)---组件概念

在angular中,可以使用命令创建组件 命令如下 ng generate component <component-name> 命令中<component-name>为需要创建的组件的名称 创建成功后,组件文件结构如下: test-component.component.html为需要显示信息的html模板。内容如下: test-component.component.less为css模板,我在创建项目时选用的是less,所以创建的为less文件。 test-componen

coderT的博客 257

OD图 arcgis曲线制作插件 od图曲线 路径图曲线制作插件 航线图曲线制作插件

在ArcGIS 10.2 中导入节点数据,打开插件,选择输入起始节点和目标节点的节点文件Point,以Name字段(地名)为连接线的起始字段和目标字段,(Input Table File)选择连接关系表格SDLine.csv,(Origin Column 和 Destination Column)为起始节点和目标节点,(Output Path)为输出路径,应选择.gdb数据库路径,否则容易报错,(Chord Coefficient)为连线的曲率,数值越大,曲率越高。运行环境:ArcGIS10.2。...

JData_Engineer的博客 2669

Angular学习笔记二之组件模版与指令Directive

创建自定义指令使用Angular-cli提供的命令:Angular会在相应的位置创建一个ts文件,并且在根模块中引入这个指令import {selector : '[appDirectiveDemo1]' // 通过属性的方式使用 }) export class DirectiveDemo1Directive {} }根模块:指令跟组件一样,必须属于某一个模块才能正常工作使用自定义指令< div appDirectiveDemo1 > 使用自定义指令 </ div ></

weixin_45855469的博客 383

YOLOv11 TensorRT极致加速:C++部署性能优化完全指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 114

通过分子模板构建随机分布在溶液中的纳米颗粒(一)

通过分子模板构建随机分布在溶液中的纳米颗粒 要实现的目标: 1、可以循环建立多个水分子溶液的模型; 2、针对不同水分子数,自动创建文件夹; 3、运行完毕将所有结果自动存储在对应文件夹里; 分子模板的具体教程请见我的博客: https://blog.youkuaiyun.com/qq_43689832/article/details/104443175 1、首先,我们先建立纳米颗粒的分子模板,命名为p_30.txt: 包括两种原子类型。具体格式如下: # LAMMPS molecule file makin.

Rockyoung 2649

angular2 学习二 directives - 使用组件

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34309543的博客 145

Apifox接口测试+自动化测试

Apifox 接口测试+自动化测试快速入门!

程序员小杨哥的博客 1万+

Angular学习(二):组件-生命周期

每个组件都有一个被 Angular 管理的生命周期。Angular 创建它,渲染它,创建并渲染它的子组件,在它被绑定的属性发生变化时检查它,并在它从 DOM 中被移除前销毁它。Angular 提供了生命周期钩子,开发者可以介入该生命周期中的这些关键时刻。除了那些组件内容和视图相关的钩子外,指令有相同生命周期钩子。 生命周期概览 每个接口(接口是可选的)都有唯一的一个钩子方法,它们的名字是由接口名再...

weixin_33810006的博客 122

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

angular学习总结十一——动态创建组件并实现交互二

动态组件上一篇写的是动态创建组件,模板动态

米斯特尔曾的博客 900

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Angular系列学习二:基本的组件说明、自定义组件和部分细节说明

作者:心叶时间:2018-07-24 16:41 基本说明 组件是Angular中非常重要的一个东西,是拥有模板的指令,是构成Angular应用的基础和核心,被用来包装特定的功能,应用程序的有序运行依赖于组件之间的协同工作。 自定义组件 假如现在有一列数据,需要使用ul和li标签显示出来,可以自定义一个名称为ui-show标签,组件代码如...

weixin_34167819的博客 186

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Angular学习之旅-----父子组件传值二@ViewChild

父组件通过局部变量获取子组件的引用 ,主动获取子组件的数据和方法 ================================================================================================ @ViewChild让父组件来获取子组件的方法 1.调用子组件给子组件定义一个名称 2. 引入 ViewChild 3....

瑞朋哥的博客 204

angular 控件css_Angular5给组件本身的标签添加样式class的方法

在Angular 5给组件本身的标签添加样式有两种方法:方式一:使用@Component的host属性@Component({selector : 'myComponent',host : {'[style.color]' : "'red'",'[style.background-color]' : 'backgroundColor'}})class MyComponent {background...

weixin_39829166的博客 712

Angular学习笔记:Angular组件

本文是自己的学习笔记,主要参考资料如下。 - B站《2020最新Angular实战教程》,老陈打码制作,https://www.bilibili.com/video/BV1i741157Fj?p=2。 1、组件的基础知识1.1、在html中使用对应ts中定义的属性1.2、快速创建一个组件2、主组件2.1、declarations3、组件3.1、@Component 1、组件的基础知识 angular中的组件一般由四个文件组成。其中,.html定义显示内容,.css定义元素样式,.ts定义页面逻辑,.sp

sinat_38393872的博客 2102

Angular学习总结-入门篇

目录 一、Angular介绍 二、 学习Angular必备基础 三、 Angular环境搭建 四、 Angular创建项目 五、 Angular环境搭建以及创建项目的时候可能遇到的错误 六、Angular开发工具介绍 Angular项目结构介绍 创建组件/服务 angular语法 变量 ngFor循环+ngIf判断+ngSwitch 动态修改样式ngClass+ngStyle 双向数据绑定 管道(Pipe) 获取dom节点 ng...

小冷在努力~ 1万+

Angular基础学习

Angular 基础

weixin_44884970的博客 2454
上一篇: Angular学习(一)【Angular-CLI,简单解析】
下一篇: Angular学习(三)【指令生命周期,路由跳转】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值