Lightning Message Service (LMS) in LWC Salesforce. LMS doesn’t need any relationship between the component. Just publish the event from one component and subscribe by multiple components simultaneously.
Key Highlights :
- Lightning Message Service is based on a new type of metadata: Lightning Message Channels
- Enable communication between the Visualforce page, Lightning web components, and Aura components.
- In LWC we will be using LMS when we want to send data from one LWC to another LWC which are not in the hierarchy.
Process & Code :
Step 1: Here we will create a Lightning Message Service (LMS) file in the messageChannels folder in the default branch.
TechdicerChannel.messageChannel-meta.xml :
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0" encoding="UTF-8"?> <LightningMessageChannel xmlns="http://soap.sforce.com/2006/04/metadata"> <description>This is a Lightning Message Service Channel.</description> <isExposed>true</isExposed> <lightningMessageFields> <description>This is sample message</description> <fieldName>message</fieldName> </lightningMessageFields> <masterLabel>TechdicerChannel</masterLabel> </LightningMessageChannel> |
Step 2: In this step, we will create two LWC component which is not related to each other, one is the Publisher and another one is the Subscriber component.
lWCLMS.HTML : this is the Publisher component.
1 2 3 4 5 6 7 8 9 10 11 | < template > < lightning-card title = "Lightning Message Service (LMS) in LWC Publisher" icon-name = "standard:contact" > < div class = "slds-p-horizontal_small" > < lightning-input type = "text" label = "Message" onchange={handleChange} value={message}></ lightning-input > <!-- call subscriber --> < div class = "slds-p-around_medium lgc-bg" style = "text-align: end;" > < lightning-button label = "Fire Event" variant = "brand" onclick={handleClick}></ lightning-button > </ div > </ div > </ lightning-card > </ template > |
lWCLMS.JS :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import { LightningElement, wire } from 'lwc' ; import TechdicerChannel from '@salesforce/messageChannel/TechdicerChannel__c' ; import {publish, MessageContext} from 'lightning/messageService' export default class LWCLMS extends LightningElement { @wire(MessageContext) messageContext; message; handleChange(event){ this .message = event.detail.value; } handleClick() { let message = {message: this .message}; publish( this .messageContext, TechdicerChannel, message); } } |
subscriber.HTML : This is the Subscriber Component.
1 2 3 4 5 6 7 | < template > < lightning-card title = "Lightning Message Service (LMS) in LWC Subscriber" icon-name = "standard:contact" > < div class = "slds-m-around_medium" > {publisherMessage} </ div > </ lightning-card > </ template > |
subscriber.JS :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import { LightningElement, wire } from 'lwc' ; import TechdicerChannel from '@salesforce/messageChannel/TechdicerChannel__c' ; import { subscribe, MessageContext } from 'lightning/messageService' ; import { ShowToastEvent } from 'lightning/platformShowToastEvent' ; export default class Subscriber extends LightningElement { publisherMessage = '' ; subscription = null ; @wire(MessageContext) messageContext; connectedCallback() { this .handleSubscribe(); } handleSubscribe() { if ( this .subscription) { return ; } this .subscription = subscribe( this .messageContext, TechdicerChannel, (message) => { console.log(message.message); this .publisherMessage = message.message; this .ShowToast( 'Success' , message.message, 'success' , 'dismissable' ); }); } ShowToast(title, message, variant, mode){ const evt = new ShowToastEvent({ title: title, message:message, variant: variant, mode: mode }); this .dispatchEvent(evt); } } |