3 types of Event Communication
· Parent to child
· Child to Parent
· Unrelated components
Parent to child:
Note: Use @api decorator in child components
Passing message from parent to child:
ChildComp
<template>
Message will come here
</template>
Js:
import { LightningElement,trac
export default class ChildComp
@track message;
@api
changeMessage(strString)
{
this.message=strString.t
}
}
<?xml version="1.0" encoding="
<LightningComponentBundle xmln
<apiVersion>46.0</apiVersi
<isExposed>false</isExpose
</LightningComponentBundle>
Parent Component:
<template>
<lightning-card title="
<lightning-layout>
<lightning-layout-
<lightning-
</lightning-
<lightning-layout-
<c-child-
</lightning-
</lightning-layout>
</lightning-card>
</template>
Js:
import { LightningElement } fr
export default class ParentCom
handleChangeEvent(event)
{
this.template.querySel
}
}
Xml:
<?xml version="1.0" encoding="
<LightningComponentBundle xmln
<apiVersion>46.0</apiVersi
<isExposed>true</isExposed
<targets>
<target>lightning__
<target>lightning__
<target>lightning__
</targets>
</LightningComponentBundle>
Child to Parent:
· Child component will create and Fire the event
· Parent component will handle the event
Handling the event in two ways:
· Declarative via html Markup
· JavaScript using add Event Listener
Declarative via html Markup
Creating Event in childComponent
const selectEvent=new CustomEv
Dispatch/fire Event in child component:
this.dispatchEvent(sel
Handling the event in Parent side using html Markup
<c-child-component2 onmycustomevent={handleCustomE
Here mycustomevent is eventName
childComponent2
<template>
<lightning-card title="
<div class="slds-m-
<lightning-input n
</div>
</lightning-card>
</template>
Js
import { LightningElement } fr
export default class ChildComp
handleChange(event)
{
const name=event.targe
const selectEvent=new
this.dispatchEvent(sel
}
}
Xml:
<?xml version="1.0" encoding="
<LightningComponentBundle xmln
<apiVersion>46.0</apiVersi
<isExposed>false</isExpose
</LightningComponentBundle>
ParentComponent2:
<template>
<div class="slds-m-around_
Value from Child: {
<c-child-component2 onmycustomevent={handleCustomE
</div>
</template>
import { LightningElement,trac
export default class ParentCom
@track msg;
handleCustomEvent(event)
{
this.msg=event.detail;
}
}
xml:
<?xml version="1.0" encoding="
<LightningComponentBundle xmln
<apiVersion>46.0</apiVersi
<isExposed>true</isExposed
<targets>
<target>lightning__
<target>lightning__
<target>lightning__
</targets>
</LightningComponentBundle>
Push Parent component to LightningPage
Using AddEventListner Method:
childComponent3
<template>
<lightning-card title="
<div class="slds-m-
<lightning-input n
</div>
</lightning-card>
</template>
Js:
import { LightningElement } fr
export default class ChildComp
handleChange(event)
{
const name=event.targe
const selectEvent=new
this.dispatchEvent(sel
}
}
Xml:
<?xml version="1.0" encoding="
<LightningComponentBundle xmln
<apiVersion>46.0</apiVersi
<isExposed>false</isExpose
</LightningComponentBundle>
ParentComponent3:
<template>
<div class="slds-m-around_
Value from Child: {
<c-child-component3></
</div>
</template>
Js:
import { LightningElement,trac
export default class ParentCom
@track msg;
constructor()
{
super();
this.template.addEventL
}
handleCustomEvent(event)
{
this.msg=event.detail;
}
}
Xml:
<?xml version="1.0" encoding="
<LightningComponentBundle xmln
<apiVersion>46.0</apiVersi
<isExposed>true</isExposed
<targets>
<target>lightning__
<target>lightning__
<target>lightning__
</targets>
</LightningComponentBundle>
Pub sub Model in Lightning Web Component:
Two components are not related to each other then we need to go for pub sub model. Its similar to Application Event in Aura Components.
· Need to use pubsub.js
· Publisher event takes 3 parameters: import these parameters pageRefrence,event Name,eventdetail from pubsub.js
· Subscriber component : Import registerListner,
PalettsPublisher:
<template>
<lightning-card title="
<lightning-layout>
<lightning-layout-
<lightning-
<div class="
<lightning
</div>
</lightning-
</lightning-layout>
</lightning-card>
</template>
Js:
import { LightningElement,trac
import {fireEvent} from 'c/
import {CurrentPageReference}
export default class PalettePu
@track color;
@wire(CurrentPageReference
colorCodeOptions=[
{label:"Green",value:"
{label:"Red",value:"
{label:"Yellow",value:
{label:"Blue",value:"
];
changeColor(event)
{
this.color= event.targe
}
handleChangeColor()
{
console.log("color ->"
fireEvent(this.pageRef
}
}
Xml:
<?xml version="1.0" encoding="
<LightningComponentBundle xmln
<apiVersion>46.0</apiVersi
<isExposed>true</isExposed
<targets>
<target>lightning__
<target>lightning__
<target>lightning__
</targets>
</LightningComponentBundle>
Canvas:
<template>
<lightning-card title="
<lightning-layout-item
<div class="
</lightning-layout-
</lightning-card>
</template>
Js:
import { LightningElement,trac
import {registerListener,unreg
import {CurrentPageReference}
export default class CanvasSub
@track color;
@wire(CurrentPageReference)
connectedCallback()
{
registerListener("
}
disconnectedCallback()
{
unregisterAllListeners(
}
handleChangedColor(
{
console.log("Color -->"
this.color=colorCode;
}
get colorStyle(){
return `background-
}
}
css
.templateBodyClass{
height:80px;
}