Bonnes pratiques LWC pour appeler la méthode enfant

voir lexemple https://developer.salesforce.com/docs/component-library/tools/playground/q8rtcVIBf/79/edit

Composant parent

<template> Value in Parent : {objMap.key} Value in Parent : {dummyStr} <lightning-button onclick={updateValue} label="Update Data"></lightning-button> <c-child obj-map={objMap} dummy-str={dummyStr}></c-child> </template> export default class App extends LightningElement { @track objMap = {key:"value"}; @track dummyStr updateValue() { this.objMap.key = "Value2"; this.dummyStr = Math.random(); // <---- ADD NEW VALUE this.template.querySelector("c-child").run(); } } 

Composant enfant

export default class Child extends LightningElement { @api objMap @api dummyStr @api run() { console.log(this.dummyStr); // <---- OLD VALUE???? } } 

Comment appeler la méthode enfant du parent quand il faut utiliser les valeurs @api?

Réponse

Cest un comportement attendu. Les valeurs des propriétés seront transmises à lenfant après la fin de lexécution de la méthode javascript afin quelle recueille toutes les propriétés modifiées et pousse les valeurs modifiées dans la chaîne. Vous pouvez comprendre cela en ayant les journaux dans le gestionnaire de modification de dummyStr comme indiqué ici

entrez la description de limage ici

Vous pouvez limplémenter de 3 manières différentes:

Option 1: Utilisez setTimeout (de préférence)

Comme indiqué ici , vous pouvez utiliser setTimeout pour appeler la méthode enfant APRÈS que la méthode parent ait terminé le traitement. Lutilisation de setTimeout poussera lappel dans un thread asynchrone à cause duquel il sexécutera plus tard après un thread synchrone.

setTimeout(()=>this.template.querySelector("c-child").run()); 

Option 2: Utiliser le gestionnaire de modifications

Comme indiqué ici , vous pouvez utiliser le gestionnaire de modifications dans lenfant api propriété qui sera appelée après la modification de la propriété.

@api get dummyStr() { return this._dummyStr; } set dummyStr(value) { this._dummyStr = value; console.log("dummyStr changed => ", this._dummyStr, value); this.run(); } 

Option 3: Utilisez le paramètre de méthode

Comme indiqué ici , transmettez les propriétés modifiées requises comme paramètres de méthode.

this.template.querySelector("c-child").run(this.dummyStr); 

Commentaires

  • Merci beaucoup! Je ne ' pas au courant de la première option. Je pensais que les valeurs entre les composants étaient envoyées par lien.

Réponse

Essayez ceci:

import { LightningElement, track } from "lwc"; export default class App extends LightningElement { @track objMap = {key:"value"}; @track dummyStr updateValue() { this.objMap.key = "Value2"; this.dummyStr = Math.random(); this.template.querySelector("c-child").run(this.dummyStr); } } 

ENFANT:

import { LightningElement, track, api } from "lwc"; export default class Child extends LightningElement { @api objMap @api dummyStr @api run(dummyStr) { console.log(dummyStr); } } 

Après avoir cliqué sur « Mettre à jour les données »:

entrez la description de limage ici

SORTIE:

entrez la description de limage ici

Lien Playground

Commentaires

  • Je viens pensé que les valeurs entre les composants envoient par lien. Je ne mattends pas à ce comportement

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *