Método secundario de llamada de mejores prácticas de LWC

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

Componente principal

<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 secundario

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

¿Cómo llamar al método hijo del padre cuando es necesario usar valores @api?

Respuesta

Este es el comportamiento esperado. Los valores de las propiedades se transmitirán al niño después de que el método javascript termine de ejecutarse para que recopile todas las propiedades modificadas y empuje los valores modificados hacia abajo en la cadena. Puede comprender esto si tiene los registros en el controlador de cambios de dummyStr como se muestra aquí

ingrese la descripción de la imagen aquí

Puede implementarlo de 3 formas diferentes:

Opción 1: Use setTimeout (preferido)

Como se muestra aquí , puede usar setTimeout para invocar el método secundario DESPUÉS de que el método principal complete el procesamiento. El uso de setTimeout empujará la invocación al hilo asíncrono por lo que se ejecutará más tarde después del hilo sincrónico.

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

Opción 2: Utilice el controlador de cambios

Como se muestra aquí , puede usar el controlador de cambios en el api propiedad que se invocará después de que se cambie la propiedad.

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

Opción 3: Utilice el parámetro de método

Como se muestra aquí , pase las propiedades cambiadas requeridas como parámetros de método.

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

Comentarios

  • ¡Muchas gracias! No ' no sabía acerca de la primera opción. Pensé que los valores entre los componentes se envían por enlace.

Respuesta

Prueba esto:

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

NIÑO:

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

Después de hacer clic en «Actualizar datos»:

ingrese la descripción de la imagen aquí

SALIDA:

ingrese la descripción de la imagen aquí

Enlace al patio de juegos

Comentarios

  • Acabo de Pensé que los valores entre componentes se envían por enlace. No espero ese comportamiento

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *