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 相关文章推荐
jquery 中多条件选择器,相对选择器,层次选择器的区别
Jul 03 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
Dec 25 Javascript
JS实现网页表格自动变大缩小的方法
Mar 09 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
Aug 11 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
原生js实现旋转木马轮播图效果
Feb 27 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
Mar 09 Javascript
VUE多层路由嵌套实现代码
May 15 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
Sep 13 Javascript
vue动态禁用控件绑定disable的例子
Oct 28 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
Oct 28 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
Look And Say 序列php实现代码
2011/05/22 PHP
php购物车实现方法
2015/01/03 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
李培根演讲稿
2014/05/22 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
会计工作检讨书
2015/02/19 职场文书
《我是什么》教学反思
2016/02/16 职场文书
React四级菜单的实现
2022/04/08 Javascript