Comunicación entre componentes no relacionados
Para la comunicación entre los árboles secundarios del DOM (y en algunos casos entre distintas ventanas de un navegador donde se ha iniciado sesión en la misma organización), puede usar Lightning Message Service (LMS). LSM es un servicio de publicación y suscripción que facilita la comunicación entre componentes web Lightning, componentes de Aura y páginas de Visualforce.
Puede usar LMS para la comunicación entre componentes no relacionados a menos que controle tanto los componentes como el componente principal común. LMS es una herramienta potente, eficaz y fácil de usar, pero no deje que eso le ciegue para usarla cuando no es realmente necesaria. Es mucho más eficiente activar eventos DOM. Si necesita comunicarse entre componentes con un elemento principal que no está bajo su control, como ranuras de App Builder, Lightning Message Service es la opción perfecta.
Una tercera unidad de negocio quiere unirse al proyecto de manipulación de cifras. Necesitan reunir Prior Count (Recuento anterior) y Count (Recuento) en su propio componente para mostrar esos datos donde los necesiten. Vamos a empezar por crear el canal de mensajería para que esté listo para los componentes.
Crear un canal de mensajería de Lightning
- En Visual Studio Code, en la carpeta default, cree una carpeta con el nombre
messageChannels
.
- En la carpeta messageChannels, cree un archivo con el nombre
Count_Updated.messageChannel-meta.xml
.
- En Count_Updated.messageChannel-meta.xml, pegue este código:
<?xml version="1.0" encoding="UTF-8" ?> <LightningMessageChannel xmlns="http://soap.sforce.com/2006/04/metadata"> <masterLabel>CountUpdated</masterLabel> <isExposed>true</isExposed> <description>Message Channel to pass Count updates</description> <lightningMessageFields> <fieldName>operator</fieldName> <description>This is the operator type of the manipulation</description> </lightningMessageFields> <lightningMessageFields> <fieldName>constant</fieldName> <description>This is the number for the manipulation</description> </lightningMessageFields> </LightningMessageChannel>
- Guarde e implemente el archivo.
Crear el componente de publicación
- Cree un componente web Lightning con el nombre
remoteControl
.
- Sustituya el contenido de remoteControl.js por el siguiente código:Importamos
import { LightningElement, wire } from 'lwc'; import { publish, MessageContext } from 'lightning/messageService'; import COUNT_UPDATED_CHANNEL from '@salesforce/messageChannel/Count_Updated__c'; export default class RemoteControl extends LightningElement { @wire(MessageContext) messageContext; handleIncrement() { // this.counter++; const payload = { operator: 'add', constant: 1 }; publish(this.messageContext, COUNT_UPDATED_CHANNEL, payload); } handleDecrement() { // this.counter--; const payload = { operator: 'subtract', constant: 1 }; publish(this.messageContext, COUNT_UPDATED_CHANNEL, payload); } handleMultiply(event) { const factor = event.detail; // this.counter *= factor; const payload = { operator: 'multiply', constant: factor }; publish(this.messageContext, COUNT_UPDATED_CHANNEL, payload); } }
publish
yMessageContext
desde Lightning Message Service. También importamos el canal que acabamos de crear (Count_Updated__c
). La carga útil de los datos se envía junto con la funciónpublish
.
- Guarde el archivo.
- Abra remoteControl.html y agregue este código entre las etiquetas
template
:Observe que estamos usando componentes de controles.<lightning-card title="Remote Control" icon-name="action:change_record_type"> <c-controls class="slds-show slds-is-relative" onadd={handleIncrement} onsubtract={handleDecrement} onmultiply={handleMultiply}> </c-controls> </lightning-card>
- Guarde el archivo.
- Actualice el archivo remoteControl.js-meta.xml para que el componente remoteControl esté disponible en las páginas de la aplicación Lightning:
<isExposed>true</isExposed> <targets> <target>lightning__AppPage</target> </targets>
- Guarde el archivo.
Crear el componente de suscripción
- Cree un componente web Lightning con el nombre
counts
.
- Sustituya el contenido de counts.js por el siguiente código:
import { LightningElement, wire } from 'lwc'; import { subscribe, MessageContext } from 'lightning/messageService'; import COUNT_UPDATED_CHANNEL from '@salesforce/messageChannel/Count_Updated__c'; export default class Counts extends LightningElement { subscription = null; priorCount = 0; counter = 0; @wire(MessageContext) messageContext; subscribeToMessageChannel() { this.subscription = subscribe( this.messageContext, COUNT_UPDATED_CHANNEL, (message) => this.handleMessage(message) ); } handleMessage(message) { this.priorCount = this.counter; if(message.operator == 'add') { this.counter += message.constant; }else if(message.operator == 'subtract') { this.counter -= message.constant; } else { this.counter *= message.constant; } } connectedCallback() { this.subscribeToMessageChannel(); } }
Con la referencia a @wire(MessageContext)
, nos aseguramos de que se ejecute unsubscribe
durante el ciclo de vida de destrucción del componente.
- Guarde el archivo.
- Abra counts.html y agregue este código entre las etiquetas
template
:<lightning-card title="Counts" icon-name="action:change_record_type"> <p class="slds-text-align_center slds-var-m-vertical_medium"> Prior Count: <lightning-formatted-number value={priorCount}></lightning-formatted-number> </p> <p class="slds-text-align_center slds-var-m-vertical_medium"> Count: <lightning-formatted-number value={counter}></lightning-formatted-number> </p> </lightning-card>
- Guarde el archivo.
- Actualice el archivo counts.js-meta.xml para que el componente "counts" esté disponible en las páginas de la aplicación Lightning:
<isExposed>true</isExposed> <targets> <target>lightning__AppPage</target> </targets>
- Guarde el archivo.
Agregar los nuevos componentes a la aplicación Event Comms
- Implemente la carpeta lwc y actualice la página de la aplicación Event Comms.
- Abra la página Event Comms para editarla.
- Arrastre el componente remoteControl a la parte derecha de la página.
- Arrastre el componente counts a la parte derecha de la página, junto debajo de remoteControl.
- Haga clic en Save (Guardar) y salga de Lightning App Builder.
Verificar las comunicaciones
- Haga clic en los botones de Remote Control (Control remoto) para cambiar el recuento del componente "counts".
Puede usar Lightning Message Service para comunicarse también con componentes de Aura y páginas de Visualforce. Es la manera más organizada de sincronizar distintos tipos de componentes.
Ahora tiene bastantes conocimientos sobre cómo funciona la comunicación entre componentes web Lightning. Ha trabajado con casos de componentes no relacionados, de componente secundario a principal y de componente principal a secundario. No olvide consultar los recursos para obtener más información sobre la comunicación entre componentes web Lightning.
Recursos
- Guía del desarrollador de componentes web Lightning: Communicate Across the DOM (Comunicación en el DOM)
- Guía del desarrollador de componentes web Lightning: Configure Event Propagation (Configurar la propagación de eventos)
- Guía del desarrollador de componentes web Lightning: Events Best Practices (Prácticas recomendadas de eventos)
- Guía del desarrollador de componentes web Lightning: Lightning Message Service
- Referencia sobre componentes web Lightning: Message Service (Servicio de mensajería)
- GitHub: LWC Recipes: lmsPublisherWebComponent (Recetas de LWC: lmsPublisherWebComponent)
- GitHub: LWC Recipes: lmsSubscriberWebComponent (Recetas de LWC: lmsSubscriberWebComponent)
- Blog de Salesforce Developers: Lightning Message Service [Developer Preview] (Vista previa del desarrollador)
- Blog de Salesforce Developers: Step Up Your LWC Skills (Mejorar sus habilidades con LWC)
- Blog de Salesforce Developers: Inter-Component Communication Patterns for Lightning Web Components (Comunicación entre componentes web Lightning)