Best practice LWC chiama il metodo figlio

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

Componente principale

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

Componente secondario

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

Come chiamare il metodo figlio dal genitore quando è necessario utilizzare i valori @api?

Risposta

Questo è il comportamento previsto. I valori delle proprietà verranno trasmessi al figlio dopo che il metodo javascript ha terminato lesecuzione in modo che raccolga tutte le proprietà modificate e spinga i valori modificati lungo la catena. Puoi capirlo disponendo dei log nel gestore delle modifiche di dummyStr come mostrato qui

inserisci qui la descrizione dellimmagine

Puoi implementarlo in 3 modi diversi:

Opzione 1: utilizza setTimeout (preferito)

Come mostrato qui , puoi usare setTimeout per richiamare il metodo figlio DOPO che il metodo genitore ha completato lelaborazione. Lutilizzo di setTimeout invierà linvocazione al thread asincrono a causa del quale verrà eseguito in seguito dopo il thread sincrono.

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

Opzione 2: utilizza il gestore delle modifiche

Come mostrato qui , puoi utilizzare il gestore delle modifiche nel api proprietà che verrà richiamata dopo la modifica della proprietà.

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

Opzione 3: utilizza il parametro del metodo

Come mostrato qui , passare le proprietà modificate richieste come parametri del metodo.

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

Commenti

  • Grazie mille! Non ' non sapevo della prima opzione. Pensavo che i valori tra i componenti fossero inviati tramite link.

Risposta

Prova questo:

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

BAMBINO:

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

Dopo aver fatto clic su “Aggiorna dati”:

inserisci qui la descrizione dellimmagine

OUTPUT:

inserisci qui la descrizione dellimmagine

Link al parco giochi

Commenti

  • Ho appena pensato che i valori tra i componenti inviati tramite link. Non mi aspetto quel comportamento

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *