web前端

angular-父子组件通信

2020-11-15  本文已影响0人  姜治宇

在vue中,父子组件的通信一般是单向的,父组件把某个数据传给子组件,而子组件不能直接修改这个数据,需要通过自定义事件回传给父组件。
angular是如何实现的呢?
首先定义两个组件:

ng g component components/father
ng g component components/child

子组件接收父组件的数据,我们需要使用@Input()装饰器,而子组件修改了数据做事件回传时,则需要@Output()装饰器。

  @Input() listdata:any; // 接收父组件的数据
  @Output() addItem = new EventEmitter(); // 回传给父组件的方法

在使用@Output()装饰器时,又需要引入EventEmitter,因此我们都需要import进来:

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

下面是一个简单的实例。
在父组件通过延时模拟ajax,往子组件传递一个数组,子组件接收到数据后进行列表渲染;
然后点击按钮,可以新增一条数据,新增的数据必须通过自定义事件回传给父组件,父组件接收到数据后,在数组后面push一条。
以上就是一个完整的单向数据流动。

father.component.html:

<app-child [listdata]="listdata"
 (addItem)="addListdata($event)"
>
</app-child>


father.component.ts:

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

@Component({
  selector: 'app-father',
  templateUrl: './father.component.html',
  styleUrls: ['./father.component.scss']
})
export class FatherComponent implements OnInit {
  public listdata:Array<Object>; // 声明列表数据

  constructor() { }
 
  ngOnInit(): void {
    setTimeout(()=>{
      this.listdata =  [{id:1,name:'a'},{id:2,name:'b'}]
    },1000);
  }
  addListdata(e){
    // console.log(e)
    this.listdata.push(e)
  }

}

child.component.html:

<ul>
    <li *ngFor="let item of listdata">
        {{item.id}}---{{item.name}}
    </li>
</ul>

<button (click)="addMethod()">增加一条数据</button>

child.component.ts:

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

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.scss']
})
 //单向数据流动,子组件接收父组件的数据,然后通过自定义事件,将改变后的数据回传父组件
export class ChildComponent implements OnInit {
  @Input() listdata:any; // 接收父组件的数据
  @Output() addItem = new EventEmitter(); // 回传给父组件的方法
  constructor() { }

  ngOnInit(): void {
  }
  addMethod(){ //增加一条数据
    let len = this.listdata.length + 1
    let obj = {id:len,name:"add item"}
    this.addItem.emit(obj);//传给父组件obj这个数据
  }

}

上一篇 下一篇

猜你喜欢

热点阅读