Maison > interface Web > js tutoriel > le corps du texte

Introduction à 5 méthodes de communication de composants dans Angular

青灯夜游
Libérer: 2021-02-01 11:47:48
avant
2308 Les gens l'ont consulté

Introduction à 5 méthodes de communication de composants dans Angular

La composantisation est le concept central d'Angular, donc la communication entre composants est utilisée plus fréquemment et est très importante.

Portail officiel :

https://angular.io/guide/component-interaction

https://angular.cn/guide/component- interaction

Recommandations de didacticiel associées : "Tutoriel angulaire"

Communication des composants parent-enfant

Mots clésEntrée Sortie EventEmitter ViewChild

1. Le composant parent transmet les données au composant enfant

[Input]

Comment lier les attributs

Composant parent :

<!-- parentComponent -->
<app-child [name]="&#39;childName&#39;"></app-child>
Copier après la connexion

Composant enfant :
// Le composant enfant doit utiliser Input pour recevoir

<span>{{name}}</span>
Copier après la connexion
@Input() public name:string = &#39;&#39;;
Copier après la connexion

2. L'enfant le composant doit utiliser Input pour recevoir les données des passes du composant

[Output EventEmitter]

Composant enfant :

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

this.childEmit.emit(data);
Copier après la connexion

Composant parent :

<app-child (childEmit)="getData($event)"></app-child>
Copier après la connexion
public getData(data:T): void {  }
Copier après la connexion

3. Méthode ViewChild

Car je pense que cette méthode peut non seulement permettre au composant parent d'obtenir les données du composant enfant, mais aussi permettre au composant parent de définir des valeurs de variable pour le composant enfant, etc., je l'ai donc séparé ici séparément.

Composant parent :

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

<button (click)="**child**.print(&#39;---&#39;)">点击</button>
Copier après la connexion
@ViewChild(&#39;child&#39;, { static: true })
public child!: ElementRef<HTMLElement>;

public print():void{
     if(this.child){
       // 这里得到child,可以使用child中的所有的public属性方法
       this.child.print(&#39;hello2&#39;);
     }
}
Copier après la connexion

[Exemple]

// 父组件
import { Component } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;app-parent&#39;,
  template: `
    <app-child #child [name]="name" (childEmit)="childClick($event)"></app-child>
    <button (click)="child.print(&#39;hello1&#39;)">调用子组件的方法1</button>
    <button (click)="print()">调用子组件的方法2</button>
  `
})

export class ParentComponent {

   public name:string = &#39;大儿子&#39;;
   @ViewChild(&#39;child&#39;, { static: true })
   public child!: ElementRef<HTMLElement>;

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

   public print():void{
      if(this.child){
        this.child.print(&#39;hello2&#39;);
     }
   }
}
/*****************************************************/
// 子组件

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

@Component({
  selector: &#39;app-child&#39;,
  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);
  }
}
Copier après la connexion

Communication entre composants non parent-enfant

1. Service

Le mode Singleton est en fait une variable, qui nécessite un déclenchement bidirectionnel (envoi d'informations/réception d'informations), et la définition et l'obtention de données nécessitent que le composant lui-même les gère.

service.ts

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

@Injectable()

export class myService {
  public info: string = &#39;&#39;;
}
Copier après la connexion

Le composant 1 transmet les informations au service

import { Service1 } from &#39;../../service/service1.service&#39;;
...

public constructor(
  public service: Service1,
) { }

public changeInfo():void {
  this.service.info = this.service.info + &#39;1234&#39;;
}
...
Copier après la connexion

Le composant 2 obtient des informations du service

import { Service2 } from &#39;../../service/service2.service&#39;;
...

public constructor(
  public service: Service2,
) { }

public showInfo() {
  console.log(this.service.info);
}
...
Copier après la connexion

2. Abonnement)

Le véritable modèle de publication-abonnement, lorsque les données changent, l'abonné peut également obtenir une réponse. Voici seulement des exemples de BehaviorSubject

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

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

/////////////////////////
// 发布
...
this.messageService.changeMessage(&#39;message change&#39;);
/////////////////////////
public 
// 订阅 (记得根据需要选择是否取消订阅 unsubscribe)
this.messageService.getMessageSource().subscribe(m => {
  console.log(m);
})
Copier après la connexion

Comparaison de quatre sujets <.>

rxjs subject 是否存储数据 是否需要初始值 何时向订阅者发布数据
Subject 及时发布。有新数据就发布
BehaviorSubject 是。存储最后一条数据或者初始值 及时发布。有新数据就发布
ReplaySubject 是。存储所有数据 及时发布。有新数据就发布
AsyncSubject 是。存储最后一条数据 延时发布。只有当数据源complete的时候才会发布
Autres méthodes de communication

Valeur de routage, stockage local du navigateur (LocalStorage, SessionStorage), cookie.

Pour plus de connaissances sur la programmation, veuillez visiter :

Introduction à la programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:jianshu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal