【Angular4】基础(四):组件通讯(@Input和@Output)

组件通讯有两种方式:
  • 父到子(用@Input装饰器)
  • 子到父(用@Output装饰器)

注意: 输入输出针对的对象 是 父子组件

1)父到子

父到子的数据传递其实就是通过将子组件上的一个属性绑定到父组件的一个属性上,一般我们使用@Input()属性装饰器来实现。

动手操作实例一:
  • 新建项目 connInComponentsng new connInComponents
  • 新增组件 stockng g c stock
  • stock.component.ts 中新增属性 stockName 并将其标记为 @Input()
@Input() protected stockName: string;
  • 既然有 @Input() 则应有对应的父组件,此处使用默认生成的主组件 app
    在父组件中定义属性 keyWork 并通过视图文件 app.component.html 中的标签 <input> 来进行双向绑定,最后在视图文件 app.component.html 中嵌入子组件并进行赋值:
// app.component.ts
protected keyWord: string;

// app.component.html
<input type="text" placeholder="请输入股票名称" [(ngModel)]="keyWord">
<app-stock [stockName]="keyWord"></app-stock>

注意:[(ngModel)] 需要在 app.module.ts 中引入模块 FormsModule

这样就完成了父组件向子组件赋值的操作了

在子组件中进行展示

<p>
    stock works!
</p>
<div>
    股票名称:{{stockName}}
</div>
动手操作实例二:
  • 新建项目 countDemong new countDemo
  • 新增组件 counterng g c counter
// counter.component.ts
@Input() count: number = 0;

increment() {
    this.count++;
}

decrement() {
    this.count--;
}

// counter.component.html
<p>当前值:{{count}}</p>
<button (click)="increment()"> + </button>
<button (click)="decrement()"> - </button>
// app.component.ts
initialCount: number = 5;

// app.component.html
<app-counter [count]="initialCount"></app-counter>
动手操作实例三:
  • 新建项目 countDemong new countDemo
  • 新增组件 counterng g c counter
// counter.component.ts
@Input() content: string;

// counter.component.html
Child: {{content}}
// app.component.ts
i: number = 0;
constructor() {
    setInterval(() => {
        this.i++;
    }, 1000)
}

// app.component.html
<h2>Parent</h2>
<app-counter [content]="i"></app-counter>
小结(父到子):
  • 子组件
    • @Input() 定义一个输入
  • 父组件
    • 使用子组件中定义的@Input()

如果不理解上述例子如何绑定的话请看我前一篇博客 基础(三):数据绑定

2)子到父

使用EventEmitter从子组件向外发射事件

不懂EventEmitter是什么?
请跳转:Node.js EventEmitter

动手操作:
  • 新建项目 countDemong new countDemo
  • 新增组件 counterng g c counter
// counter.component.ts
@Output() changeNumber: EventEmitter<number> = new EventEmitter();
Number: number = 0;
constructor() {
    setInterval(() => {
        this.changeNumber.emit(++this.Number);
    }, 1000);
}

// counter.component.html  这里不用更改
// app.component.ts
i: number = 0;

numberIChange(i:number) {
    this.i = i;
}

// app.component.html
<h2>Parent: {{i}}</h2>
<app-counter (changeNumber)="numberIChange($event)"></app-counter>
小结(子到父):
  • 子组件
    • @Output() 定义一个输出
    • 写一个自定义方法,通过emit,触发@Output
  • 父组件
    • 使用子组件中定义的@Output()
    • $event必须,$event是父组件通过emit传过来的

通过 子组件的输入输出属性父组件的属性绑定和事件绑定 可以实现父子组件之间的数据传递

注:只有第一个例子写的比较详细,后面几个因为差不多所以不做过多解释,如还有疑惑请留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值