angular的输入和输出的使用方法


Posted in Javascript onSeptember 22, 2018

angular的核心组件化,可以说组件化的相当彻底。而要实现组件之间的通信,一个必不可少的就是输入和输出。通过对输入输出的学习,更加加深我对组件化的认识。

组件的输入

angular允许使用两种形式来定义组件的输入,一种是在装饰器@Component中使用inputs来定义,另一种是使用@Input来定义。

inputs

首先先介绍在装饰器中使用的输入。inputs接收的是一个字符串数组,用来指定我们输入的键名。

@Component({
 selector: 'my-component',
 inputs: ['name']
})
class MyComponent {
 name: string;
}

name就会对应我们组件中的name变量。

然后我们定义一个组件,当然不可避免有的时候会在其他的组件的模板中使用,所以就可以这样写。

上级组件

export class AppComponent {
 myName = 'zhangsan';
 ...
}

上级组件的模板

<app-messages [name]="myName"></app-messages>
方括号[]:数据绑定,也叫输入绑定。将等号右边的变量绑定在左边[]中的变量上。

我们的组件

@Component({
 selector: 'app-messages',
 inputs: ['name'],
 templateUrl: './messages.component.html',
 styleUrls: ['./messages.component.css']
})
export class MessagesComponent implements OnInit {
 name: string;
}

这里我们就用name接受了上级组件的myName

angular的输入和输出的使用方法

angular的输入和输出的使用方法

通过上面的图,就很容易看输入数据的对应关系。

然后我们打印一下看看变量是否成功输入了。

export class MessagesComponent implements OnInit {
 name: string;

 ngOnInit() {
  console.log(this.name);
 }
}

angular的输入和输出的使用方法

成功输入!

@Input

上面我们实现了组件的数据输入,但是angular并没有满足现状,还提供另外一种输入的方法,就是@Input

@Component({
 selector: 'my-component'
})
class MyComponent {
 @Input() name: string;
}

只要在我们的组件中定义变量的时候使用@Input装饰器就行了。对比上面我们使用inputs时,少了一个二次声明。这种方法感觉数据的传递少了一层关系,更加易于理解,而且代码也更加的工整。

组件输出

说完了组件的输入,下面我们就该聊聊组件的输出了。要将数据从组件中传递出去,就要使用输出绑定

<button (click)="display()"></button>
圆括号(): 事件绑定,又叫输出绑定。这里我们监听click事件,然后触发display方法。

除了click,angular还有很多内置的事件,当然,我们在编写自己的组件的时候,也可以自定义一个事件,来与外部通信。

自定义事件

自定义的事件需要做三件事情:

1.在@Component配置中,制定outputs配置项
2.在配置的属性中,设置一个EventEmitter(事件触发器)
3.在适当的时候,也就是要触发的方法中,通过EventEmitter触发事件

下面看一下示例:

@Component({
 selector: 'my-component',
 outputs: ['newEvent']
})
export class MyComponent {
 newEvent: EventEmitter<string>;
 
 constructor() {
  this.newEvent = new EventEmitter();
 }
 
 display(): void {
  this.newEvent.emit("test event");
 }
}

然后我们就可以通过上面模板中的代码实现输出了。

如果想在一个父级的组件中使用这个输出,就要使用我们自己的事件了。下面看一个示例:

父级组件:

export class AppComponent {
 ...
 showEvent(message: string) {
  console.log(`hello: ${message}`);
 }
}

父级模板:

<app-messages (newEvent)="showEvent($event)"></app-messages>

我们的组件:

@Component({
 selector: 'app-messages',
 outputs: ['newEvent'],
 templateUrl: './messages.component.html'
})
export class MessagesComponent {
 newEvent: EventEmitter<string>;

 constructor(private messageService: MessageService) {
  this.newEvent = new EventEmitter();
 }

 display(): void {
  this.newEvent.emit('test event');
 }
}

我们的组件模板:

<button (click)="display()">触发</button>
引用文字

然后点击触发,可以看到输出hello:test event。数据输出成功!

angular的输入和输出的使用方法

好了我们再来梳理整个输出过程:

1.我们自定以一个组件,通过内置的click事件触发display方法,这时就会触发我们自定义的事件:newEvent

angular的输入和输出的使用方法

2.当事件触发的时候,他会执行上一级的方法:showEvent

angular的输入和输出的使用方法

3.我们的事件输出了一个字符串test event,然后通过$event获取这个输出结果,并当做参数传给上一级的方法showEvent

@Output

同输入相同,angular也为我们提供了输出的第二种方式:@Output

用法与@input类似:

export class MessagesComponent {
 @Output() newEvent: EventEmitter<string>;
}

只有在定义的时候,省去了重新声明的一步。

官方参考:https://angular.io/api/core/Component

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript vvorld 在线加密破解方法
Nov 13 Javascript
同一个表单 根据要求递交到不同页面的实现方法小结
Aug 05 Javascript
浅析JavaScript原型继承的陷阱
Dec 03 Javascript
JS修改iframe页面背景颜色的方法
Apr 01 Javascript
php结合imgareaselect实现图片裁剪
Jul 05 Javascript
AngularJS通过$http和服务器通信详解
Sep 21 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
Sep 23 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
Nov 01 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
Dec 14 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
Sep 20 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
javascript浅层克隆、深度克隆对比及实例解析
Feb 09 Javascript
vue构建动态表单的方法示例
Sep 22 #Javascript
小程序实现展开/收起的效果示例
Sep 22 #Javascript
玩转vue的slot内容分发
Sep 22 #Javascript
vue 巧用过渡效果(小结)
Sep 22 #Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 #Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 #Javascript
vue中,在本地缓存中读写数据的方法
Sep 21 #Javascript
You might like
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
php树型类实例
2014/12/05 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
layui表格分页 记录勾选的实例
2019/09/02 Javascript
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
TensorFlow的权值更新方法
2018/06/14 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
python中PyQuery库用法分享
2021/01/15 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
商业房地产广告语
2014/03/13 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
班主任经验交流心得体会
2015/11/02 职场文书