Rumah > hujung hadapan web > tutorial js > Mari kita bincangkan tentang cara berkomunikasi antara komponen dalam Angular

Mari kita bincangkan tentang cara berkomunikasi antara komponen dalam Angular

青灯夜游
Lepaskan: 2022-05-17 21:02:28
ke hadapan
2496 orang telah melayarinya

Artikel ini akan membantu anda meneruskan pembelajaran angular dan mempelajari tentang kaedah komunikasi komponen dalam Angular, saya harap ia akan membantu semua orang!

Mari kita bincangkan tentang cara berkomunikasi antara komponen dalam Angular

Dalam artikel sebelum ini, kita bercakap tentang Angular digabungkan dengan NG-ZORRO untuk pembangunan pesat . Pembangunan front-end sebahagian besarnya adalah pembangunan berasaskan komponen dan sentiasa tidak dapat dipisahkan daripada komunikasi antara komponen. Jadi, dalam pembangunan Angular, bagaimanakah komunikasi antara komponennya? [Tutorial berkaitan yang disyorkan: "tutorial sudut"]

Buat inferens daripada satu contoh, Vue dan React kebanyakannya sama

Artikel ini adalah teks tulen, perbandingan membosankan. Oleh kerana perkara yang dicetak oleh konsol agak tidak berguna, saya tidak memasukkan gambar Hmm~ Saya harap pembaca dapat dengan mudah menyerapnya dengan mengikuti kod penjelasan~

1 kepada komponen anak melalui atribut

Ia adalah bersamaan dengan anda menyesuaikan sifat dan menghantar nilai kepada subkomponen melalui pengenalan komponen. Show you the CODE.

<!-- parent.component.html -->

<app-child [parentProp]="&#39;My kid.&#39;"></app-child>
Salin selepas log masuk

Panggil subkomponen dalam komponen induk, di sini namakan atribut parentProp.

// child.component.ts

import { Component, OnInit, Input } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;app-child&#39;,
  templateUrl: &#39;./child.component.html&#39;,
  styleUrls: [&#39;./child.component.scss&#39;]
})
export class ChildComponent implements OnInit {
  // 输入装饰器
  @Input()
  parentProp!: string;

  constructor() { }

  ngOnInit(): void {
  }
}
Salin selepas log masuk

Komponen anak menerima pembolehubah parentProp yang dihantar oleh komponen induk dan mengisinya semula ke halaman.

<!-- child.component.html -->

<h1>Hello! {{ parentProp }}</h1>
Salin selepas log masuk

2 Komponen anak menghantar maklumat kepada komponen induk melalui peristiwa Pemancar

Salurkan data komponen anak kepada komponen induk melalui new EventEmitter().

// child.component.ts

import { Component, OnInit, Output, EventEmitter } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;app-child&#39;,
  templateUrl: &#39;./child.component.html&#39;,
  styleUrls: [&#39;./child.component.scss&#39;]
})
export class ChildComponent implements OnInit {
  // 输出装饰器
  @Output()
  private childSayHi = new EventEmitter()

  constructor() { }

  ngOnInit(): void {
    this.childSayHi.emit(&#39;My parents&#39;);
  }
}
Salin selepas log masuk

Memberitahu komponen induk melalui emit dan komponen induk mendengar acara tersebut.

// parent.component.ts

import { Component, OnInit } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;app-communicate&#39;,
  templateUrl: &#39;./communicate.component.html&#39;,
  styleUrls: [&#39;./communicate.component.scss&#39;]
})
export class CommunicateComponent implements OnInit {

  public msg:string = &#39;&#39;

  constructor() { }

  ngOnInit(): void {
  }

  fromChild(data: string) {
    // 这里使用异步
    setTimeout(() => {
      this.msg = data
    }, 50)
  }
}
Salin selepas log masuk

Dalam komponen induk, selepas kami memantau data daripada komponen child, operasi tak segerak setTimeout digunakan di sini. Ini kerana kami melakukan emit selepas memulakannya dalam subkomponen Operasi tak segerak di sini adalah untuk mengelakkan Race Condition ralat persaingan.

Kami juga perlu menambah kaedah fromChild dalam komponen, seperti berikut:

<!-- parent.component.html -->

<h1>Hello! {{ msg }}</h1>
<app-child (childSayHi)="fromChild($event)"></app-child>
Salin selepas log masuk

3. Melalui rujukan, komponen induk memperoleh sifat dan kaedah komponen kanak-kanak

Kami memperoleh objek subkomponen dengan memanipulasi rujukan, dan kemudian mengakses sifat dan kaedahnya.

Kami mula-mula menetapkan kandungan demo subkomponen:

// child.component.ts

import { Component, OnInit } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;app-child&#39;,
  templateUrl: &#39;./child.component.html&#39;,
  styleUrls: [&#39;./child.component.scss&#39;]
})
export class ChildComponent implements OnInit {

  // 子组件的属性
  public childMsg:string = &#39;Prop: message from child&#39;

  constructor() { }

  ngOnInit(): void {
    
  }

  // 子组件方法
  public childSayHi(): void {
    console.log(&#39;Method: I am your child.&#39;)
  }
}
Salin selepas log masuk

Kami menetapkan pengecam rujukan subkomponen pada komponen induk #childComponent:

<!-- parent.component.html -->

<app-child #childComponent></app-child>
Salin selepas log masuk

dan kemudian javascript Panggil pada fail:

import { Component, OnInit, ViewChild } from &#39;@angular/core&#39;;
import { ChildComponent } from &#39;./components/child/child.component&#39;;

@Component({
  selector: &#39;app-communicate&#39;,
  templateUrl: &#39;./communicate.component.html&#39;,
  styleUrls: [&#39;./communicate.component.scss&#39;]
})
export class CommunicateComponent implements OnInit {
  @ViewChild(&#39;childComponent&#39;)
  childComponent!: ChildComponent;

  constructor() { }

  ngOnInit(): void {
    this.getChildPropAndMethod()
  }

  getChildPropAndMethod(): void {
    setTimeout(() => {
      console.log(this.childComponent.childMsg); // Prop: message from child
      this.childComponent.childSayHi(); // Method: I am your child.
    }, 50)
  }

}
Salin selepas log masuk

Adakah terdapat pengehadan kepada kaedah ini, iaitu, pengubah suai atribut perlu public Apabila ia protected atau private, ralat akan dilaporkan. Anda boleh cuba menukar pengubah suai subkomponen. Sebab ralat adalah seperti berikut:

类型使用范围
public允许在累的内外被调用,作用范围最广
protected允许在类内以及继承的子类中使用,作用范围适中
private允许在类内部中使用,作用范围最窄

4 Ubah

Mari tunjukkan dengan rxjs.

rxjs ialah perpustakaan untuk pengaturcaraan reaktif menggunakan Observables, yang memudahkan untuk menulis kod tak segerak atau berasaskan panggilan balik.

Akan ada rekod artikel kemudian rxjs, jadi nantikan

Mari buat perkhidmatan bernama parent-and-child dahulu.

// parent-and-child.service.ts

import { Injectable } from &#39;@angular/core&#39;;
import { BehaviorSubject, Observable } from &#39;rxjs&#39;; // BehaviorSubject 有实时的作用,获取最新值

@Injectable({
  providedIn: &#39;root&#39;
})
export class ParentAndChildService {

  private subject$: BehaviorSubject<any> = new BehaviorSubject(null)

  constructor() { }
  
  // 将其变成可观察
  getMessage(): Observable<any> {
    return this.subject$.asObservable()
  }

  setMessage(msg: string) {
    this.subject$.next(msg);
  }
}
Salin selepas log masuk

Seterusnya, kami merujuknya dalam komponen ibu bapa dan anak, dan maklumat mereka dikongsi.

// parent.component.ts

import { Component, OnDestroy, OnInit } from &#39;@angular/core&#39;;
// 引入服务
import { ParentAndChildService } from &#39;src/app/services/parent-and-child.service&#39;;
import { Subject } from &#39;rxjs&#39;
import { takeUntil } from &#39;rxjs/operators&#39;

@Component({
  selector: &#39;app-communicate&#39;,
  templateUrl: &#39;./communicate.component.html&#39;,
  styleUrls: [&#39;./communicate.component.scss&#39;]
})
export class CommunicateComponent implements OnInit, OnDestroy {
  unsubscribe$: Subject<boolean> = new Subject();

  constructor(
    private readonly parentAndChildService: ParentAndChildService
  ) { }

  ngOnInit(): void {
    this.parentAndChildService.getMessage()
      .pipe(
        takeUntil(this.unsubscribe$)
      )
      .subscribe({
        next: (msg: any) => {
          console.log(&#39;Parent: &#39; + msg); 
          // 刚进来打印 Parent: null
          // 一秒后打印 Parent: Jimmy
        }
      });
    setTimeout(() => {
      this.parentAndChildService.setMessage(&#39;Jimmy&#39;);
    }, 1000)
  }

  ngOnDestroy() {
    // 取消订阅
    this.unsubscribe$.next(true);
    this.unsubscribe$.complete();
  }
}
Salin selepas log masuk
import { Component, OnInit } from &#39;@angular/core&#39;;
import { ParentAndChildService } from &#39;src/app/services/parent-and-child.service&#39;;

@Component({
  selector: &#39;app-child&#39;,
  templateUrl: &#39;./child.component.html&#39;,
  styleUrls: [&#39;./child.component.scss&#39;]
})
export class ChildComponent implements OnInit {
  constructor(
    private parentAndChildService: ParentAndChildService
  ) { }
  
  
  // 为了更好理解,这里我移除了父组件的 Subject
  ngOnInit(): void {
    this.parentAndChildService.getMessage()
      .subscribe({
        next: (msg: any) => {
          console.log(&#39;Child: &#39;+msg);
          // 刚进来打印 Child: null
          // 一秒后打印 Child: Jimmy
        }
      })
  }
}
Salin selepas log masuk

Dalam komponen induk, kami menukar nilai selepas satu saat. Jadi dalam komponen induk-anak, nilai awal msg null akan dicetak sebaik sahaja ia masuk, dan kemudian selepas satu saat, nilai yang diubah Jimmy akan dicetak. Dengan cara yang sama, jika anda memberikan maklumat perkhidmatan dalam komponen kanak-kanak, semasa komponen kanak-kanak mencetak nilai yang berkaitan, ia juga akan dicetak dalam komponen induk.

【Tamat】

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengenalan kepada Pengaturcaraan! !

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara berkomunikasi antara komponen dalam Angular. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan