LWC-metode til bedste praksis for opkaldsunderord

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

Overordnet 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???? } } 

Hvordan kaldes barnemetoden fra forælder, når det er nødvendigt at bruge @api-værdier?

Svar

Dette er forventet adfærd. Egenskabsværdierne videregives til underordnet, efter at metoden javascript er kørt, så det samler alle de ændrede egenskaber og skubber de ændrede værdier ned i kæden. Du kan forstå dette ved at have logfilerne i ændringshåndteringen af dummyStr som vist her

indtast billedbeskrivelse her

Du kan implementere det på 3 forskellige måder:

Mulighed 1: Brug setTimeout (foretrukket)

Som vist her , du kan bruge setTimeout til at påkalde underordnet metode, EFTER den overordnede metode er færdig med behandlingen. Brug af setTimeout vil skubbe påkaldelsen til asynkron tråd, hvorfor den kører senere efter synkron tråd.

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

Valgmulighed 2: Brug Change handler

Som vist her , du kan bruge ændringshåndterer i underordnet api egenskab, der påkaldes, efter at ejendommen er ændret.

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

Mulighed 3: Brug metodeparameter

Som vist her , send de krævede ændrede egenskaber som metodeparametre.

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

Kommentarer

  • Mange tak! Jeg vidste ikke ' om den første mulighed. Jeg troede, at værdier mellem komponenter sendes via link.

Svar

Prøv dette:

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

BØRN:

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

Efter at have klikket på “Opdater data”:

indtast billedbeskrivelse her

OUTPUT:

indtast billedbeskrivelse her

Legepladslink

Kommentarer

  • Jeg bare troede, at værdier mellem komponenter sendes via link. Jeg forventer ikke den adfærd

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *