LWC-metod för bästa praxis samtalsbarn

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

Överordnad komponent

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

Underkomponent

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

Hur man kallar barnmetod från förälder när man behöver använda @api-värden?

Svar

Detta är förväntat beteende. Egenskapsvärdena kommer att överföras till underordnat när metodens javaskript är klart så att det samlar alla ändrade egenskaper och trycker de ändrade värdena ner i kedjan. Du kan förstå detta genom att ha loggarna i ändringshanteraren för dummyStr som visas här

ange bildbeskrivning här

Du kan implementera det på tre olika sätt:

Alternativ 1: Använd setTimeout (föredragen)

Som visas här , du kan använda setTimeout för att åberopa den underordnade metoden NÄR den överordnade metoden har slutfört behandlingen. Att använda setTimeout kommer att trycka på anropet till asynkron tråd på grund av vilken den kommer att köras senare efter synkron tråd. > Alternativ 2: Använd Ändringshanteraren

Som visas här , du kan använda ändringshanteraren i underordnat api egenskap som anropas efter att egenskapen har ändrats.

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

Alternativ 3: Använd metodparameter

Som visas här , skicka de ändrade egenskaperna som metodparametrar.

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

Kommentarer

  • Tack så mycket! Jag visste inte ' om det första alternativet. Jag trodde att värden mellan komponenter skickas med länk.

Svar

Prova det här:

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

BARN:

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

Efter att ha klickat på ”Uppdatera data”:

ange bildbeskrivning här

UTGÅNG:

ange bildbeskrivning här

Lekplatslänk

Kommentarer

  • Jag bara trodde att värden mellan komponenter skickas med länk. Jag förväntar mig inte det beteendet

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *