Angular 組件通信 5種方法

組件化是Angular的核心概念培愁,所以組件通信的使用就比較多而且很重要。

官方傳送門??:
https://angular.io/guide/component-interaction , https://angular.cn/guide/component-interaction

父子組件通信

關(guān)鍵詞 Input Output EventEmitter ViewChild

1凉翻、父組件 向 子組件 傳遞數(shù)據(jù)

【Input】

綁定屬性的方式

父組件:

<!-- parentComponent -->
<app-child [name]="'childName'"></app-child>

子組件:
// 子組件需要使用Input接收

<span>{{name}}</span>
@Input() public name:string = '';

2嗜傅、子組件 向 父組件 傳遞數(shù)據(jù)

【Output EventEmitter】

子組件:

@Output()
public readonly childEmit: EventEmitter<T> = new EventEmitter<T>();

this.childEmit.emit(data);

父組件:

<app-child (childEmit)="getData($event)"></app-child>
public getData(data:T): void {  }

3、ViewChild 方法

因?yàn)槲矣X得這個方法既可以讓父組件獲取子組件的數(shù)據(jù)泪勒,又可以讓父組件給子組件設(shè)置變量值等跌前,所以我這里單獨(dú)分了出來棕兼。

父組件:

<app-child **#child**></app-child>

<button (click)="**child**.print('---')">點(diǎn)擊</button>
@ViewChild('child', { static: true })
public child!: ElementRef<HTMLElement>;

public print():void{
     if(this.child){
       // 這里得到child,可以使用child中的所有的public屬性方法
       this.child.print('hello2');
     }
}

【示例】


// 父組件
import { Component } from '@angular/core';

@Component({
  selector: 'app-parent',
  template: `
    <app-child #child [name]="name" (childEmit)="childClick($event)"></app-child>
    <button (click)="child.print('hello1')">調(diào)用子組件的方法1</button>
    <button (click)="print()">調(diào)用子組件的方法2</button>
  `
})

export class ParentComponent {

   public name:string = '大兒子';
   @ViewChild('child', { static: true })
   public child!: ElementRef<HTMLElement>;

   public childClick(bool:Boolean):void{
      // TODO
   }

   public print():void{
      if(this.child){
        this.child.print('hello2');
     }
   }
}
/*****************************************************/
// 子組件

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

@Component({
  selector: 'app-child',
  template: `
    <h3 (click)="myClick()">{{name}}</h3>
  `
})

export class HeroChildComponent {
  @Input() 
  public name: string;

  @Output()
  public readonly childEmit: EventEmitter<boolean> = new EventEmitter<boolean>();

  public myClick():void{
    this.childEmit.emit(true);
  }

  public print(content:string):void{
    console.log(content);
  }
}

非父子組件通信

1抵乓、Service

單例模式伴挚,其實(shí)就是一個變量,需要雙向觸發(fā)(發(fā)送信息 / 接收信息)灾炭,及設(shè)置和獲取數(shù)據(jù)都需要組件自己去處理茎芋。

service.ts

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

@Injectable()

export class myService {
  public info: string = '';
}

組件 1 向 service 傳遞信息

import { Service1 } from '../../service/service1.service';
...

public constructor(
  public service: Service1,
) { }

public changeInfo():void {
  this.service.info = this.service.info + '1234';
}
...

組件 2 從 service 獲取信息

import { Service2 } from '../../service/service2.service';
...

public constructor(
  public service: Service2,
) { }

public showInfo() {
  console.log(this.service.info);
}
...

2、Subject(發(fā)布訂閱)

真正的發(fā)布訂閱模式蜈出,當(dāng)數(shù)據(jù)改變時田弥,訂閱者也能得到響應(yīng),這里只舉了BehaviorSubject的例子

// Service
import { BehaviorSubject } from 'rxjs';
...
public messageSource = new BehaviorSubject<string>('Start');
public changeMessage(message: string): void {
  this.messageSource.next(message);
}

public getMessageSource(): Observable<string> {
  return this.messageSource.asObservable();
}

/////////////////////////
// 發(fā)布
...
this.messageService.changeMessage('message change');
/////////////////////////
public 
// 訂閱 (記得根據(jù)需要選擇是否取消訂閱 unsubscribe)
this.messageService.getMessageSource().subscribe(m => {
  console.log(m);
})

四種主題Subject對比??

rxjs subject 是否存儲數(shù)據(jù) 是否需要初始值 何時向訂閱者發(fā)布數(shù)據(jù)
Subject 及時發(fā)布。有新數(shù)據(jù)就發(fā)布
BehaviorSubject 是铡原。存儲最后一條數(shù)據(jù)或者初始值 及時發(fā)布偷厦。有新數(shù)據(jù)就發(fā)布
ReplaySubject 是。存儲所有數(shù)據(jù) 及時發(fā)布燕刻。有新數(shù)據(jù)就發(fā)布
AsyncSubject 是沪哺。存儲最后一條數(shù)據(jù) 延時發(fā)布。只有當(dāng)數(shù)據(jù)源complete的時候才會發(fā)布

其他通信方式??

路由傳值酌儒、瀏覽器本地存儲(LocalStorage,SessionStorage)枯途、cookie忌怎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末籍滴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榴啸,更是在濱河造成了極大的恐慌孽惰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸥印,死亡現(xiàn)場離奇詭異勋功,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)库说,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門狂鞋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潜的,你說我怎么就攤上這事骚揍。” “怎么了啰挪?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵信不,是天一觀的道長。 經(jīng)常有香客問我亡呵,道長抽活,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任锰什,我火速辦了婚禮下硕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歇由。我一直安慰自己卵牍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布沦泌。 她就那樣靜靜地躺著糊昙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谢谦。 梳的紋絲不亂的頭發(fā)上释牺,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天,我揣著相機(jī)與錄音回挽,去河邊找鬼没咙。 笑死,一個胖子當(dāng)著我的面吹牛千劈,可吹牛的內(nèi)容都是我干的祭刚。 我是一名探鬼主播,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涡驮!你這毒婦竟也來了暗甥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤捉捅,失蹤者是張志新(化名)和其女友劉穎撤防,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棒口,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寄月,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了无牵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漾肮。...
    茶點(diǎn)故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖合敦,靈堂內(nèi)的尸體忽然破棺而出初橘,到底是詐尸還是另有隱情,我是刑警寧澤充岛,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布保檐,位于F島的核電站,受9級特大地震影響崔梗,放射性物質(zhì)發(fā)生泄漏夜只。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一蒜魄、第九天 我趴在偏房一處隱蔽的房頂上張望扔亥。 院中可真熱鬧,春花似錦谈为、人聲如沸旅挤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粘茄。三九已至,卻和暖如春秕脓,著一層夾襖步出監(jiān)牢的瞬間柒瓣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工吠架, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芙贫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓傍药,卻偏偏與公主長得像磺平,于是被迫代替她去往敵國和親魂仍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容