站長資訊網
        最全最豐富的資訊網站

        淺談Angular組件之間通信的5種方法

        Angular組件間怎么通信?下面本篇文章給大家介紹一下Angular組件之間通信的5種方法,有需要的可以參考~

        淺談Angular組件之間通信的5種方法

        組件是angular的構建單元,在項目中為了保證組件之間的數據能夠來回的傳遞,angular封裝了一些能夠實現組件之間通信的方法。【相關教程推薦:《angular教程》】

        一、父組件通過輸入型綁定將數據傳遞給子組件

        父組件

        parent.component.ts

        age = 18; name = '  xiaoming '

        parent.component.html

        <app-child-1 [age]="age" [name]="name"></app-child-1>

        子組件

        child1.component.ts

        @Input() age!: number;

        截聽輸入屬性值的變化

        1、使用一個輸入屬性的 setter,以攔截父組件中值的變化,并采取行動。

        child1.component.ts

        @Input() set name(name: string) {     this._name = name.trim(); } private _name: string;

        2、使用 ngOnChanges()鉤子函數來監測輸入屬性值的變化并做出回應。當需要監視多個、交互式輸入屬性的時候,本方法比用屬性的 setter 更合適。

        child1.component.ts

        ngOnChanges(changes: SimpleChanges): void {     console.log(changes); }

        我們可以通過angular官方提供的類型描述文件了解到SimpleChange的相關屬性:

        淺談Angular組件之間通信的5種方法

        淺談Angular組件之間通信的5種方法

        二、父組件監聽子組件的事件獲取子組件傳遞給父組件的值

        子組件暴露一個EventEmitter(帶有@Output裝飾器)屬性,當事件發生時,子組件利用該屬性emit事件往父組件發射值。父組件綁定到這個事件屬性,并在事件發生時作出回應。

        子組件

        child1.component.ts

        @Output() voted = new EventEmitter<boolean>(); emitValue(): void {     this.voted.emit(true); }

        child1.component.html

        <button (click)="emitValue()">Click</button>

        父組件

        parent.component.html

        <app-child-1 [age]="age" [name]="name" (voted)="getChildParam($event)"></app-child-1>

        parent.component.ts

        getChildParam(value: boolean): void {     console.log(value); // true }

        三、父組件通過本地變量(#varibleName)在模板中讀取子組件的屬性和調用子組件的方法

        子組件

        child1.component.ts

        address = 'Shanghai'; setAddress(address: string): void {     this.address = address; }

        父組件

        parent.component.html

        <app-child-1 [age]="age" [name]="name" (voted)="getChildParam($event)" #child1Component></app-child-1> <div>{{child1Component.address}}</div> <button (click)="child1Component.setAddress('Beijing')">Click</button>

        局限性:父組件-子組件的連接必須全部在父組件的模板中進行。如果父組件的類需要讀取子組件的屬性值或調用子組件的方法,就不能使用本地變量方法。

        四、父組件調用@ViewChild

        當父組件的類需要讀取子組件的屬性值或調用子組件的方法,就不能使用本地變量方法;如果有這種需求時,我們可以通過@ViewChild把子組件注入到父組件中;

        父組件

        parent.component.ts

        @ViewChild(Child1Component) private child1Component!: Child1Component;

        可以通過child1Component變量訪問子組件的屬性和方法;

        五、利用共享服務實現任意組件之間的通信

        為了實現任意組件之間的通信,我們可以結合Rxjs中的BehaviorSubject對象來創建一個共享服務;BehaviorSubject的使用可以參考這篇博客blog.tcs-y.com/2019/10/08/…

        創建dataService.ts

        import {BehaviorSubject} from 'rxjs'; import { Injectable} from '@angular/core'; @Injectable(   {providedIn: 'root'} ) export class DataService {   data: BehaviorSubject<number> = new BehaviorSubject<number>(0); }

        在組件1的構造函數中注入服務并設置data

        child1.component.ts

        constructor(private dataService: DataService) {}     // 設置data的值 changeData(): void {     this.dataService.data.next(10); }

        child1.component.html

        <button (click)="changeData()">Click</button>

        在組件2的構造函數中注入服務并訂閱data

        child2.component.ts

        constructor(private dataService: DataService) {     this.dataService.data.subscribe(value => {         console.log(value); // 10     }); }

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 欧美精品久久久久久久自慰| 久久99精品国产99久久| 国产成人精品高清在线观看93| 精品国产一区二区三区在线观看| 99国产欧美精品久久久蜜芽| 亚洲午夜国产精品无码老牛影视 | 日韩精品无码一本二本三本 | 国产精品二区观看| 国产a精品视频| 无码人妻精品一区二区三区东京热 | 国产综合精品久久亚洲| 99精品无人区乱码在线观看| 中文字幕精品一区二区精品| 日韩精品毛片| 久久夜色精品国产亚洲av| 精品国产乱码久久久久久浪潮| 夜色www国产精品资源站| 精品国产污污免费网站| 国产福利精品一区二区| 亚洲精品成人网站在线观看 | 国产AV午夜精品一区二区三区| 亚洲精品无码MV在线观看| 亚洲国产精品成人久久蜜臀| 日韩精品无码免费视频| 青青久久精品国产免费看| 欧美国产成人精品一区二区三区| 国产精品小黄鸭一区二区三区| 2023国产精品自拍| 久热这里只精品99re8久| 精品亚洲综合久久中文字幕| 国产精品臀控福利在线观看 | 一本久久a久久精品综合香蕉| 欧美成人精品一区二三区在线观看| 国产精品麻豆VA在线播放| 国产精品免费久久| 国产午夜精品久久久久九九| 狠狠精品干练久久久无码中文字幕 | 成人国产精品高清在线观看| 99久久国产综合精品麻豆| 精品一区二区三区中文字幕| 亚洲国产精品久久久久婷婷软件|