跳到主要内容

组件间传值

一、输入属性(父组件向子组件传值)

比如主组件向Home组件传递数据:

父组件传递数据:

// app.component.html 主组件
<app-home messageText="这是主组件传递的数据"></app-home>

子组件接收数据:

// home.component.ts
// 修饰器,将messageText修饰为外部传入的属性
@Input()
// 定义一个属性,未给值
messageText: string

// home.component.html
<p>{{messageText}}</p>

注意:装饰器@Input需要先引入才能使用。

将主组件传入的字符串变为动态属性:

主组件在调用home组件的时候有两种方式:

<!--方式一-->
<app-home messageText="{{text}}"></app-home>

<!--方式二-->
<app-home [messageText]="text"></app-home>

给输入属性改名

给Input装饰器加个参数就是新的名字。

@Input('mt');
messageText:string;

// 调用的时候
<app-message [mt]="text"></app-massage>

二、输出属性(子组件向父组件传值)

示例:Home组件调用child组件。

1、子组件发送数据

child组件

import { Component, OnInit, Output, EventEmitter } from '@angular/core';

export class ChildComponent implements OnInit {

constructor() { }

ngOnInit() {
}

// 装饰为输出属性
@Output()
// childData为属性名,发给父组件的数据为string类型
childData: EventEmitter<string> = new EventEmitter();

// 点击按钮发送数据(不需要事件名,事件名就是输出属性名。)
send() {
this.childData.emit('子组件发给父组件的数据');
}

}

不需要事件名,事件名就是输出属性名。

2、父组件接收数据

Home组件引入child组件

<app-child (childData)="getData($event)"></app-child>

触发接收子组件的数据的事件名就是输出属性名。

$event (是固定写法),用来存放子组件发来的数据。

export class HomeComponent implements OnInit {

constructor() { }

ngOnInit() {
}

// 接收子组件的数据
getData(data) {
console.log(data);
}

}

三、子组件互相传值

1、中间人模式

子组件A --> 父组件 --> 子组件B