前端开发框架之Angular自定义组件学习分享

ByteLunarEclipse
• 阅读 279

创建组件
在components文件夹下创建一个数据库下载的公用组件。
打开命令行(使用vscode编辑器的小伙可以直接使用Ctrl+` 快捷键打开终端,然后一路跳转到components文件夹:
cd src\app\components
在此目录下执行指令:
ng g c es-download
上面指令的意思是创建一个名为es-download的组件,
前端开发框架之Angular自定义组件学习分享
使用上面的指令创建的组件是会前端培训被自动引用到components这个模块中的。
components.module.ts
import { EsDownloadComponent } from './es-download/es-download.component'; //引入组件
@NgModule({
declarations: [..., EsDownloadComponent],//声明组件
})
上面是在使用ng g c es-download指令时自动完成的
但若是想在其它的模块中使用这个es-download组件,还得将其导出。
导出的方式是将这个组件添加至components.module.ts文件的exports中:
@NgModule({
declarations: [..., EsDownloadComponent],
imports: [...],
exports: [..., EsDownloadComponent],
})
export class ComponentsModule { }
组件的基础概念
查看es-download.component.ts
import { Component, OnInit } from '@angular/core';

@Component({
selector: 'app-es-download',
templateUrl: './es-download.component.html',
styleUrls: ['./es-download.component.css']
})
export class EsDownloadComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}可以看到此处从@angular/core中引入Component装饰器;并且建立了一个类,用@Component修饰它;在@Component中,设置了selector自定义标签和template模板。组件的几个关键知识点如下:
前端开发框架之Angular自定义组件学习分享
组件与模块
模块是在组件之上的一层抽象,组件以及指令、管道、服务、路由等都能通过模块去组织。
Angular提供了@NgModule装饰器来创建模块,一个应用可以有多个模块,有且只有一个根模块(Root Module),其他模块叫做特性模块(Feature Module)
根模块是启动应用的入口模块,根模块必须通过bootstrap元数据来指定应用的根组件,然后通过bootstrapModule()方法来启动应用。
建立一个根模块,命名为AppModule,并将它保存为app,module.ts。
app.module.ts中通过@NgModule的bootstrap元数据指定AppComponent组件
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';

@NgModule({
declarations: [...],
imports: [...],
providers: [...],
bootstrap: [AppComponent]
})
export class AppModule { }
AppComponent组件即为根组件。
再创建一个main.ts,利用platformBrowserDynamic().bootstrapModule()方法来启动根模块,并将AppComponent组件的内容展示到页面上。
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';

platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
引用es-download组件
由于我们最开始是将es-download组件引入到components这个模块中,并从这个模块中导出的,所以想要在其它模块中使用 es-download组件就得先引入components模块。
将根模块AppModule,作为父组件来引用一下es-download组件
首先在模块里引用:
import { NgModule } from '@angular/core';
import { ComponentsModule } from './components/components.module';

@NgModule({
declarations: [...],
imports: [...,

ComponentsModule,
],

})
export class AppModule { }
引入了components模块就相当于是引入那个那个模块中的所有组件和方法。
使用es-download组件
根据selector: 'app-es-download',所以要使用es-download这个组件,需要在HTML中添加自定义标签
<app-es-download></app-es-download>,然后Angular便会在此标签中插入EsDownloadComponent组件中指定的模板。
import { Component, OnInit } from '@angular/core';

@Component({
selector: 'app-es-download',
templateUrl: './es-download.component.html',
styleUrls: ['./es-download.component.css']
})
组件交互
事件交互
由于es-download.component.html中的按钮有点击事件
<button
style="..."
nz-button
nzType="primary"
(click)="esDownload()"

数据库下载</button>所以es-download.component.ts中需要实例化一个用来订阅和触发自定义事件的EventEmitter类
import { Component, OnInit,Output,EventEmitter} from '@angular/core';//引入Output,EventEmitter

@Component({
selector: 'app-es-download',
templateUrl: './es-download.component.html',
styleUrls: ['./es-download.component.css']
})
export class EsDownloadComponent implements OnInit {
@Output() click = new EventEmitter(); //通过输出属性@Output将数据流向父组件
......
//点击事件函数esDownload() { ....... }}
数据交互
父组件将数据通过属性绑定的方式流向子组件,子组件通过输入属性@Input获取来自父组件的数据。
父组件的html文件:
<app-es-download [name]="name" ></app-es-download>子组件的ts文件:
import { Component, OnInit,Output,EventEmitter,Input} from '@angular/core';
@Component({
selector: 'app-es-download',
templateUrl: './es-download.component.html',
styleUrls: ['./es-download.component.css']
})
export class EsDownloadComponent implements OnInit {
@Output() click = new EventEmitter();
@Input() name:'';
其中name数据是通过装饰器@Input来获取来自父组件的name对象,数据由父组件流出,在子组件中通过输入属性@Input完成数据的接收。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
Vue+ElementUI 导航组件
创建导航页组件在components目录下新建一个navigation目录,在Navi目录中新建一个名为Navi.vue的组件。至此我们的目录应该是如下图所示: !(https://img2018.cnblogs.com/blog/1213900/201909/121390020190911165808209545381725
昔不亏 昔不亏
4年前
「组件」侧边hover锚点导航双向绑定
样式如图:1:在components文件夹下新建SideAnchorNav.vuejs<template<divclass"sideAnchorNav"<divclass"leftnav":class"navText?'navHover':''"@mouseenter"navTexttrue"@mou
Jacquelyn38 Jacquelyn38
4年前
牛逼!五分钟开发一款桌面版应用
1、下载nw.jshttps://nwjs.io/最好下载sdk版本。2、解压打开安装包下载完之后,解压打开图中的app文件夹是我自己创建的,你也需要自己创建一个,里面放你项目文件。app文件夹中一般放一个index.html(页面展示),另外还需要创建一个package.json文件(参数配置):        "name":  "first  ap
昔不亏 昔不亏
4年前
「组件」返回顶部按钮
样式如图1:在components文件夹下新建BackTop.vuejs<template<divclass"backTopBtn"<ahref"javascript:;"<divvif"btnFlag"class"btn"@click"backTop"TOP</div
昔不亏 昔不亏
4年前
「组件」倒计时
1:在components文件夹下新建CountDown.vuejs<template<p{{time}}</p</template<scriptexportdefault{data(){return{time:'',
Stella981 Stella981
3年前
Angular 1 深度解析:组件化编程
angular1也要面向组件编程前端组件化是前端开发模式中一个不可逆转的趋势,三大主要前端框架angular2reactvue都不约而同的把组件化编程作为自己的一大卖点,angular1作为一个历史相对悠久的框架,在私生子angular2的推动下,终于也搭上了组件化编程的末
Stella981 Stella981
3年前
Angular Elements 组件在非angular 页面中使用的DEMO
一、AngularElements介绍   AngularElements是伴随Angular6.0一起推出的新技术。它借助Chrome浏览器的ShadowDom API,实现一种自定义组件。这种组件可以用Angular普通组件的开发技术进行编写,学习成本低,当它构建好后生成一个打包的js文件
ByteLunarEclipse
ByteLunarEclipse
Lv1
你在我这里无法保存,因为你过于庞大,内存不足。
文章
9
粉丝
0
获赞
0