Angular中父子组件传值@Input @Output @ViewChild最全面最简单的总结

原文出处:https://blog.youkuaiyun.com/xfwdxt/article/details/82111016 

个人总结:
@Input   - 子组件定义接受父组传入数据或方法的变量;
@Output - 子组件定义接受父组传入方法的变量; 
@ViewChild - 父组件定义子组件实例引用的变量;
 

父组件传递给子组件:

值传递方式:@Input既可以传递数据也可以传递方法

@Input传递数据(参考:父子组件传值@Input @Output @ViewChild
1.子组件定义接受数据的变量(msg)

//子组件引入 Input 模块 
import { Component, OnInit ,Input } from '@angular/core';

export class HeaderComponent implements OnInit { 

    @Input() msg: string;    // 接受数据的变量

    constructor() { }

    ngOnInit() {}
}

2.子组件的模板绑定变量(msg)

<h2>这是头部组件--{{msg}}</h2>

3.父组件调用子组件的时候传入数据

<app-header [msg]="msg"></app-header>

 如果想监控父组件传给子组件数据的变化可以在子组件用ngOnChanges方法实现
详见:《ngular2父子组件之间数据传递:@Input和@Output (上)

 

@Input传递方法

// 父组件定义方法
parentRun(){    
    alert('这是父组件的 run 方法');
}

调用子组件时传入当前方法(是传递方法不是调用方法)

<app-header [msg]="msg" [run]="parentRun"></app-header>

子组件接收和使用父组件传过来的方法

import { Component, OnInit ,Input } from '@angular/core';
 
export class HeaderComponent implements OnInit {   
    @Input() msg:string 
    @Input() run:any; // 接收父组件传递过来的方法parentRun
    
    constructor() { }  

    ngOnInit() {
        this.run(); // 子组件调用父组件的parentRun方法
    } 
}

子组件传递给父组件:

1、事件传递方式:@Output + EventEmitter事件传递的方式

子组件实例化装饰器修饰的EventEmitter实例,并在需要的时候发出传递事件的信号(可以传参)

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

export class HeaderComponent implements OnInit {     
    // 用EventEmitter和Output装饰器配合使用,<string>指定广播传递的参数类型变量    
    @Output() private outer = new EventEmitter<string>();         

    sendParent(){        
        this.outer.emit('msg from child'); // 广播传递数据给父组件    
    } 
}

父组件调用子组件的时候,定义接收事件 , outer就是子组件的EventEmitter对象outer

<!--一旦接收到子组件发出的事件传递信号后就会执行父组件中定义好的接收方法-->
<app-header (outer)="runParent($event)"></app-header>   

// 接收子组件传递过来的数据 
runParent(msg:string){    
    alert(msg); 
}


2、主动获取:父组件通过局部变量获取子组件的引用,主动获取子组件的数据和方法

子组件定义如下:

export class FooterComponent implements OnInit { 
    public msg:string;    
    public msg: string;     
    
    constructor() { }         

    ngOnInit() {}      

    footerRun(){        
        alert('这是footer子组件的Run方法');    
    }
}

父组件调用子组件的时候给子组件取个id标识(即模板变量#footer)

<app-footer #footer></app-footer>

2.1、可在页面上直接获取执行子组件的方法(footer.footerRun)

<button (click)='footer.footerRun()'>获取子组件的数据</button>

2.2、在控制器controller中通过@ViewChild,引入模板变量#footer

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

@ViewChild('footer') footerChild; // 在父组件的控制器中引用子组件     

run(){        
    this.footerChild.footerRun(); // 在父组件的控制器中调用子组件的方法或变量    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值