LWC best practice call child method (Română)

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

Componenta părinte

<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(); } } 

Componenta copil

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

Cum să apelați metoda copil de la părinte când trebuie să utilizați valorile @api?

Răspuns

Acesta este un comportament așteptat. Valorile proprietăților vor fi transmise copilului după ce metoda javascript este terminată de rulare, astfel încât să colecteze toate proprietățile modificate și să împingă valorile modificate în jos în lanț. Puteți înțelege acest lucru având jurnalele în gestionarul de schimbare al dummyStr așa cum se arată aici

introduceți descrierea imaginii aici

Puteți să-l implementați în 3 moduri diferite:

Opțiunea 1: utilizați setTimeout (preferat)

Așa cum se arată aici , puteți utiliza setTimeout pentru a invoca metoda copil DUPĂ ce metoda părinte finalizează procesarea. Utilizarea setTimeout va împinge invocarea într-un fir asincron din cauza căruia va rula ulterior după firul sincron.

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

Opțiunea 2: Utilizați handlerul de schimbare

Așa cum se arată aici , puteți utiliza handlerul de schimbare în copil api proprietate care va fi invocată după modificarea proprietății.

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

Opțiunea 3: utilizați parametrul metodei

După cum se arată aici , treceți proprietățile modificate necesare ca parametri ai metodei.

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

Comentarii

  • Mulțumesc mult! Nu ' nu știam despre prima opțiune. Am crezut că valorile dintre componente se trimit prin link.

Răspuns

Încercați acest lucru:

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); } } 

COPIL:

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

După ce ați făcut clic pe „Actualizare date”:

introduceți descrierea imaginii aici

IEȘIRE:

introduceți descrierea imaginii aici

Link teren de joacă

Comentarii

  • Tocmai am crezut că valorile dintre componente se trimit prin link. Nu mă aștept la acest comportament

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *