全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Angular2 父子组件数据通信实例

如今的前端开发,都朝组件式开发模式靠拢,如果使用目前最流行的前端框架Angular和React开发应用,不可避免地需要开发组件,也就意味着我们需要考虑组件间的数据传递等问题,不过Angular 2已经为我们提供了很好的解决方案。

父组件和子组件

接触过面向对象编程的开发者肯定不会对父子关系陌生,在Angular 2中子组件存在于父组件“体内”,并且父子组件可以通过一些渠道进行通讯。

父组件向子组件传入数据 – @Input

当我们着手开始开发一个组件时,第一件想到的应该就是为其传入数据,毕竟我们期望组件为我们处理某些工作通常就需要给其提供“养料”,毕竟不能又让马儿跑,又不给马儿吃草。Angular 2中子组件使用装饰器@Input接收父组件传入的数据:

// child-component.ts
import { OnInit, Component, Input } from '@angular/core';

@Component({
  selector: 'child-component',
  ...
})
export class ChildComponent implements OnInit {
  @Input
  count: number = 0;

  ngOnInit() {
    console.log(this.count);  // 父组件内传入的值或者我们自己设置的初始值0
  }

  increaseNumber() {
    this.count ++;
  }

  descreaseNumber() {
    this.count --;
  }
}

可以看到,我们使用装饰器@Input修饰了count属性,这就意味着child-component被使用时期望收到一个名为count的属性,当然不属于自己掌控的范围内要小心行事,别人使用我们的组件时什么情况都可能出现,所以我们为count设置了一个初始值,当父组件没有给我们的count属性传值时,我们就取此初始值。

// father-component.ts
import { Component } from '@angular/core';
import { ChildComponent } from '../child-component/child-component';

@Component({
  template: `
    <child-component [count]='initialCount'></child-component>
  `,
  ...
})
export class FatherComponent {
  initialCount: number = 5;
}

父组件使用child-component时,为count属性赋予初始值initialCount,即5,也就是说此时ChildComponent的ngOnInit方法中会打印出5。注意[count]语法标识了数据流向:父组件流入子组件,即单向数据绑定。此时如果传入的数据是基本数据类型,子组件中对数组做任何操作都不会影响到父组件,但如果传入的不是基本数据类型,而是引用数据类型,则要格外注意子组件中对数据的操作可能会对父组件产生影响。

子组件通知父组件数据已处理完成 – @Output、EventEmitter

父组件传入数据给子组件之后并不是万事大吉了,就像父母养育孩子,供其读书,但孩子需要把学习进度、考试成绩等呈现给父母看(不管是否自愿…),父组件也需要子组件在合适的时机通知自己数据已经处理好,可以检阅了。而此时就需要使用@Output和EventEmitter了。

// father-component.ts
import { Component } from '@angular/core';
import { ChildComponent } from '../child-component/child-component';

@Component({
  template: `
    <child-component [count]='initialCount' (change)="countChange($event)"></child-component>
  `,
  ...
})
export class FatherComponent {
  initialCount: number = 5;

  countChange($event) {

  }
}

看看我们在父组件中加入了什么东东:

1.(change),看到这样的语法第一时间就知道这是事件绑定,也就是说我们在父组件中监听子组件的某些变化,并能够在其变化时作出相关操作;

2.增加了countChange方法作为change事件的处理函数。

但是稍等,当我们为input标签指定type、placeholder等属性时,我们知道它们都已经被“实现了”,所谓“实现”,即这些属性在input标签上是有意义的。但是目前这里我们为child-component指定了名为change的事件是没意义的,因为其并未“实现”change事件,于是下一步我们就需要使用@Output和EventEmitter将其变得有意义:

// child-component.ts
import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'child-component',
  ...
})
export class ChildComponent {
  @Input
  count: number = 0;

  @Output
  change = new EventEmitter();

  increaseNumber() {
    this.count ++;
    this.change.emit(this.count);
  }

  descreaseNumber() {
    this.count --;
    this.change.emit(this.count);
  }
}

让我们再来看看在子组件中增加了什么东东:

1.使用装饰器@Output修饰了change属性,并为其赋了初值为EventEmitter的实例;

2.在increaseNumber和descreaseNumber方法修改了count属性后,调用了change属性的emit方法通知父组件。

此时,我们在ChildComponent中实现了change,于是父组件中为child-component绑定change事件也就有意义了:当子组件通知父组件时,父组件可以获取到通知中携带的数据并进行下一步操作:

// father-component.ts
...
countChange($event) {
  this.initialCount = $event;
}
...

总结

不知道你有没有发现,其实上面我们模拟了“双向数据绑定”:父组件将数据传入子组件,子组件改变数据时通知父组件进行“同步更新”。但是要注意其实数据流向是单向的,即数据是父组件单向流入子组件,父组件数据的更新是通过子组件的事件通知以后才被更新。也就是说其实在Angular 2中:双向数据绑定 = 单向数据绑定 + 事件,以我们最熟悉的ngModel为例:

<input type='text' name='userName' [(ngModel)]="userName">

和下面的写法是等价的:

复制代码 代码如下:
<input type='text' name='userName' [ngModel]="userName" (ngModelChange)="userName=$event">

同样的,如果将我们的child-component组件写作双向数据绑定的形式即为:

复制代码 代码如下:
<child-component [(count)]='initialCount'></child-component>

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


# angular2父子组件通信  # angular2  # 父子组件  # angular2父子组件通讯  # Angular2 父子组件通信方式的示例  # Angular 2父子组件之间共享服务通信的实现  # angular父子组件通信详解  # 绑定  # 为其  # 也就  # 也就是说  # 会对  # 当我们  # 有意义  # 中对  # 增加了  # 这是  # 实现了  # 很好  # 就像  # 是有  # 让我们  # 万事大吉  # 给我们  # 将其  # 这就  # 可以通过 


相关文章: 保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  python的本地网站制作,如何创建本地站点?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  ppt制作免费网站有哪些,ppt模板免费下载网站?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  c# 服务器GC和工作站GC的区别和设置  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  如何打造高效商业网站?建站目的决定转化率  如何在阿里云部署织梦网站?  营销式网站制作方案,销售哪个网站招聘效果最好?  ,sp开头的版面叫什么?  如何在阿里云香港服务器快速搭建网站?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  移民网站制作流程,怎么看加拿大移民官网?  如何在局域网内绑定自建网站域名?  制作网站公司那家好,网络公司是做什么的?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  C#如何在一个XML文件中查找并替换文本内容  如何获取免费开源的自助建站系统源码?  建站主机空间推荐 高性价比配置与快速部署方案解析  如何快速生成专业多端适配建站电话?  如何配置WinSCP新建站点的密钥验证步骤?  微信h5制作网站有哪些,免费微信H5页面制作工具?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  制作宣传网站的软件,小红书可以宣传网站吗?  建站之星Pro快速搭建教程:模板选择与功能配置指南  建站与域名管理如何高效结合?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  jQuery 常见小例汇总  建站主机选哪种环境更利于SEO优化?  如何制作网站标识牌,动态网站如何制作(教程)?  如何在新浪SAE免费搭建个人博客?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  建站之星2.7模板:企业网站建设与h5定制设计专题  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何规划企业建站流程的关键步骤?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何解决VPS建站LNMP环境配置常见问题?  建站主机选购指南与交易推荐:核心配置解析  如何用PHP快速搭建高效网站?分步指南  宝塔建站后网页无法访问如何解决?  深入理解Android中的xmlns:tools属性  如何快速上传建站程序避免常见错误?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。