Comunicación entre elemento principal y secundario
Para permitir la comunicación desde un componente principal hasta uno secundario, el secundario debe exponer una propiedad o función para que sea pública. De esta manera, el principal podrá actualizar la propiedad pública del secundario o llamar a la función pública del secundario.
Además, si quiere agregar algo funcionalidad, puede actualizar la propiedad pública a un "getter" o un "setter" en el componente secundario.
Empecemos por una actualización sencilla de la propiedad pública. Otra unidad de negocio ha encontrado el numerador que usted creó. Quieren usarlo y agregar datos. Su primera petición es poder definir el número inicial del contador. No queremos realizar cambios que afecten al caso de uso empresarial original, así que vamos a acoplar el componente de numerador a otro componente para que este asuma la nueva funcionalidad.
Actualizar una propiedad pública
El decorador @api
del componente secundario permite exponer una propiedad, es decir, hacer que sea pública, para que el componente principal pueda actualizarla.
- Exponga una propiedad pública en el componente secundario (numerador):
- En Visual Studio Code, abra numerator.js y aplique el decorador
@api
a la propiedadcounter
:@api counter = 0;
- Importe el decorador
api
desde el módulolwc
.
- Guarde el archivo.
- Cree y codifique un nuevo componente principal con el nombre
augmentor
:
- Cree un componente web Lightning con el nombre
augmentor
.
- En augmentor.js, pegue este código dentro de la clase
Augmentor
(Aumentador):startCounter = 0; handleStartChange(event) { this.startCounter = parseInt(event.target.value); }
- Guarde el archivo.
- Abra augmentor.html y agregue este código entre las etiquetas
template
:<lightning-card title="Augmentor" icon-name="action:download"> <lightning-layout> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-input label="Set Starting Counter" type="number" min="0" max="1000000" value={startCounter} onchange={handleStartChange}> </lightning-input> </lightning-layout-item> </lightning-layout> <c-numerator class="slds-show slds-is-relative" counter={startCounter}> </c-numerator> </lightning-card>
- Guarde el archivo.
- Actualice el archivo augmentor.js-meta.xml para que el componente "augmentor" esté disponible en las páginas de la aplicación Lightning:
<isExposed>true</isExposed> <targets> <target>lightning__AppPage</target> </targets>
- Guarde el archivo.
- Agregue el nuevo componente (augmentor) a la página de la aplicación Event Comms:
- Implemente la carpeta lwc y actualice la página de la aplicación Event Comms.
- Abra la página de la aplicación Event Comms para editarla.
- Arrastre el componente augmentor a la parte central de la página.
- Haga clic en Save (Guardar) y salga de Lightning App Builder.
- Verifique las comunicaciones:
- Para ver los cambios en Salesforce, actualice la página de la aplicación Event Comms.
- Introduzca un número en el campo Set Starting Counter (Definir contador de inicio).
El recuento se actualiza a la cifra que haya introducido.
- Haga clic en uno de los botones de multiplicar.
Observe que el contador se actualiza, pero el valor de Set Starting Counter (Definir contador de inicio) se queda igual.
- Cambie los valores en el componente numerador original.
Sigue funcionando según lo previsto.
Como hemos colocado Set Starting Counter (Definir contador de inicio) en su propio componente (augmentor) en lugar de agregarlo al componente "numerator", este último sigue cumpliendo su función para el caso empresarial original. Ahora, el numerador recibe datos tanto del componente secundario (controls) como del principal (augmentor).
Llamar a una función pública
La segunda petición de la empresa es aumentar el recuento en un millón. Pero no quieren que se cambie el valor de Set Starting Count (Definir recuento de inicio). Esto significa que no podemos actualizar sin más la propiedad startCounter. Además, no tenemos el recuento actual en el componente "augmentor" para sumar datos ahí. Vamos a llamar a una función pública en el elemento secundario para que haga los cambios por nosotros.
El decorador @api
del componente secundario permite exponer una función, es decir, hacer que sea pública, para que el componente principal pueda llamar.
- Cree una función pública en el componente secundario (numerator):
- Abra numerator.js y agregue esta función
maximizeCounter
después de la funciónhandleMultiply
:@api maximizeCounter() { this.counter += 1000000; }
- Guarde el archivo.
- En el componente principal (augmentor), agregue un botón y su controlador:
- Abra augmentor.js y agregue esta función
handleMaximizeCounter
después de la funciónhandleStartChange
:Esta función busca la etiquetahandleMaximizeCounter() { this.template.querySelector('c-numerator').maximizeCounter(); }
c-numerator
en el archivo augmentor.html y llama a la función públicamaximizeCounter
.
- Guarde el archivo.
- Abra augmentor.html y agregue
lightning-button
después delightning-input
en Set Starting Counter (Definir contador de inicio):<lightning-button class="slds-var-p-vertical_xx-small" label="Add 1m To Counter" onclick={handleMaximizeCounter}> </lightning-button>
- Guarde el archivo.
- Verifique las comunicaciones:
- Para ver los cambios en Salesforce, implemente la carpeta lwc y actualice la página de la aplicación Event Comms.
- Haga clic en Add 1m To Counter (Agregar un millón al contador).
El recuento aumenta en un millón.
En el componente principal (augmentor), con el nuevo botón se activa el controlador handleMaximizeCounter
, que permite llamar al componente secundario (numerator) y activar la función pública maximizeCounter
.
Usar un "getter" y un "setter" públicos
Este ejercicio es muy similar al de actualizar una propiedad que hemos completado al principio de este paso. De hecho, no vamos a cambiar nada del componente principal. En el componente secundario, vamos a implementar la propiedad pública "counter" con un "getter" y un "setter" públicos.
A las dos unidades de negocio que usan Event Comms les encantan los cambios. Ahora, nos piden poder ver el valor anterior del recuento a medida que este cambia. Necesitamos una forma de capturar el recuento actual cada vez que cambiemos la propiedad "counter". Podemos obtener el recuento actual y guardarlo antes de definir el valor nuevo. Vamos a usar una variable privada llamada _currentCount
para que podemos solucionarlo. Para conservar el recuento anterior y poder mostrarlo, vamos a usar una variable llamada priorCount
.
Para conseguir esta funcionalidad nueva, vamos a implementar la propiedad counter
en forma de "getter" y "setter" (get
y set
, también conocidos como propiedad "accessor"). Cada vez que se define el contador, almacenaremos el valor actual (_currentCount
) en la variable priorCount
antes de definir el nuevo valor del contador.
- Agregue un recuento anterior al componente secundario (numerator):
- Abra el archivo numerator.html y agregue este párrafo justo antes del párrafo con el recuento:
<p class="slds-text-align_center slds-var-m-vertical_medium"> Prior Count: <lightning-formatted-number value={priorCount}></lightning-formatted-number> </p>
- Guarde el archivo.
- Abra numerator.js y convierta
@api counter = 0;
en un comentario (agregue//
al principio de la línea).
- Después del comentario, agregue el siguiente código:El código cambia el valor de
_currentCount = 0; priorCount = 0; @api get counter() { return this._currentCount; } set counter(value) { this.priorCount = this._currentCount; this._currentCount = value; }
counter
a una propiedad con funciones "getter" (get
) y "setter" (set
). También agrega las propiedadespriorCount
y_currentCount
.
- Guarde el archivo.
- Verifique las comunicaciones:
- Para ver los cambios en Salesforce, implemente la carpeta lwc y actualice la página de la aplicación Event Comms.
- Haga clic en Add (Agregar), X2 y Add 1m To Counter (Agregar un millón al contador) para cambiar el valor de "counter".
El contador anterior se mantiene sincronizado a medida que actualiza el contador.
- Haga clic en los botones de los componentes Numerator (Numerador) y Augmentor (Aumentador) para comprobar que la funcionalidad original no se vea afectada.
Hemos actualizado el componente "numerator" para utilizar un "getter" y un "setter", y actualizar la nueva propiedad priorCount
. El componente principal (augmentor) sigue enviando información (startCounter
) al componente secundario (numerator). Pero ahora, "numerator" utiliza un "getter" y un "setter" para obtener (get
) la propiedad _currentCount
y definir (set
) las propiedades _currentCount
y priorCount
.
Póngase a prueba (es opcional, no vamos a revisar el código)
Actualice handleMaximizeCounter
y maximizeCounter
para aceptar un argumento que especifique el número que se va a sumar al recuento. Sugerencia: Revise lo que ha hecho en el primer paso para enviar un data-factor
con el evento personalizado multiply
.
Resumen
Ha aprendido a gestionar la comunicación de componente secundario a principal y de principal a secundario entre componentes web Lightning. En el siguiente paso, utilizará Lightning Message Service para la comunicación entre componentes que no tienen una relación de principal-secundario.
Recursos
- YouTube: Lightning Web Components: Parent-Child Components (Componentes principales-secundarios)
- Guía del desarrollador de componentes web Lightning: Create and Dispatch Events (Crear y enviar eventos)
- GitHub: LWC Recipes: apiProperty (Recetas de LWC: apiProperty)
- GitHub: LWC Recipes: apiSetterGetter (Recetas de LWC: apiSetterGetter)
- Blog de Salesforce Developers: Inter-Component Communication Patterns for Lightning Web Components (Comunicación entre componentes web Lightning)