This will be the third of a series of posts I will be doing over the next few weeks. They will all lead up to the introduction of my new course titled, “Building Your First Lightning Web Component for Salesforce” from Pluralsight. These posts will contain code snippets of the code used in the course, but will not include all the tips and best practices about using SFDX, along with the way I personally approach teaching in my video courses.
You also have to realize that the solution is built in stages and so the code you see here is not exactly what you will see by the end of the next module. For all that, you will just have to wait and watch the course, which I hope you do.
And Finally, I know there has been a big delay between the first two posts and these remaining posts, but I promise you that the delay will have been worth the wait. I am VERY proud of how this course is turning out and feel like it will be my best yet.
Component Design
LWC’s are similar to Aura components in the fact that you should consider each component as an application building block. And just like with Aura components, most LWC’s will contain many smaller, nested components. The biggest difference is that the communication patterns between Aura components and LWC’s is VERY different.
LWC Nested Composition
In this course, we will actually be creating multiple LWC components that demonstrate a nested pattern. At the outermost layer we will have a Lightning App Page and inside of that will be an owner or container component. The owner can contain other components, which also contain other components. What is happening here is that we have a parent-child relationship going on and that is very important is determining how data is passed between LWC components.
Creating the Owner Component
At first this component (which we will name myFirstLWC) will just contain placeholder text for where the two components it will contain will ultimately reside. Here is the HTML we will use for now:
<template>
<div class="c-container">
<lightning-layout multiple-rows="true">
<lightning-layout-item padding="around-small" size="12">
<lightning-layout>
<lightning-layout-item padding="around-small" size="6">
<div class="slds-box slds-theme_default">
<h2>TO DO: Add List LWC Component here</h2>
</div>
</lightning-layout-item>
<lightning-layout-item padding="around-small" size="6">
<div class="page-section page-main">
<h2>TO DO: Add Map LWC Component here</h2>
</div>
</lightning-layout-item>
</lightning-layout>
</lightning-layout-item>
</lightning-layout>
</div>
</template>
You will also need to modify the metadata file so it exposes this component (but ONLY this component since it is the owner) to the Lightning App Builder.
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata" fqn="MyFirstLWC">
<apiVersion>47.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__RecordPage</target>
<target>lightning__AppPage</target>
<target>lightning__HomePage</target>
</targets>
</LightningComponentBundle>
- Type “Lightning App” in Quick Find and select Lightning App Builder.
- Click New to start the Wizard.
- Leave the default on App Page and click Next.
- Enter the label “Lead Locator” and click Next.
- Select One Region and click Finish.
- In the Builder, scroll down to to the Custom List and drag the myFirstLWC onto the design surface.
- Click Save.
- Click Activate when prompted.
- From the Activation Wizard, accept the defaults, and select the Lightning Experience tab.
- Select Sales and click Add Page to app.
- Click Save.
- Click Back to return to Setup.
- Click the App Launcher and select the Sales app.You should see the Lead Locator app and you should select it to see your very basic app so far.
Creating the LeadList Component
The Here is the HTML for our leadList component. Notice that it contains two other nested components. One is a Lightning base component called lightning-input and the other is a custom one yet to be created called lead-list-item.
<template>
<lightning-card title="Lead Search" icon-name="standard:search" class="slds--around_medium">
<div class="slds-box slds-theme_default">
<lightning-input
label="Search Term"
variant="label-hidden"
placeholder="Search by name, phone, website, or address"
type="text"
value={searchTerm}
onchange={handleSearchTermChange}>
</lightning-input>
<h3>Leads for {searchTerm}</h3>
</div>
<div class="slds-m-around_small">
<template if:true={leads}>
<template for:each={leads} for:item="lead">
<c-lead-list-item key={lead.Id} lead={lead} ></c-lead-list-item>
</template>
</template>
</div>
</lightning-card>
</template>
Since this module is only about Composition and not about data, the JavaScript for this component will just contain some static JSON code to represent the lead data. It will also use the Track decorators for the leads array and the searchTerm, which allow you to keep track of a properties value when it is re-rendered.
Most importantly, it will follow best practices and use the simplest way to communicate with events by using a standard CustomEvent called newsearch.
import { LightningElement, track} from 'lwc';
export default class LeadList extends (LightningElement) {
@track leads =[];
@track searchTerm;
handleSearchTermChange(event) {
this.searchTerm = event.target.value;
const selectedEvent = new CustomEvent('newsearch', {detail: this.searchTerm});
this.dispatchEvent(selectedEvent);
}
leads = [
{
"Id": "LeadRef1",
"Name": "Bertha Boxer",
"Title": "Director of Vendor Relations",
"Company": "Farmers Coop. of Florida",
"Street": "321 Westcott Building",
"City": "Tallahassee",
"State": "FL",
"PostalCode": "32306"
},
{
"Id": "LeadRef2",
"Name": "Phyllis Cotton",
"Title": "CFO",
"Company": "Chamber of Commerce",
"Street": "300 E Park Ave",
"City": "Tallahassee",
"State": "FL",
"PostalCode": "32301"
},
{
"Id": "LeadRef3",
"Name": "Jeff Glimpse",
"Title": "SVP, Procurement",
"Company": "Tallahassee Taxes",
"Street": "1327 Colorado St",
"City": "Tallahassee",
"State": "FL",
"PostalCode": "32304"
}
];
}
Modifying the Owner Component
Since we added a CustomEvent to the leadList component, we will need to add some JavaScript to the owner component, myFirstLWC that will handle this event.
import { LightningElement, track } from 'lwc';
export default class MyFirstLWC extends LightningElement {
@track searchTerm;
handleNewSearch(event) {
this.searchTerm = event.target.value;
}
}
We will also need to modify the HTML so that we remove the placeholder text for the leadList component. Notice though how it is named. All LWC’s will be rendered with the c namespace, followed by a hyphen and then the component name, which is also separated by a hyphen. LWC knows that the leadList component is two words because we used kebab or camel case when naming it. This is a commonly used HTML standard and it means that the component must start with a lowercase letter and the other letter must be capitalized with no spaces in between, which is how we named the leadList component.
<c-lead-list onnewsearch={handleNewSearch}></c-lead-list>
Creating the leadListItem Component
This is just a very basic component that will display the results of the search. Not much to it for now.
<template>
<lightning-layout vertical-align="center">
<lightning-layout-item padding="around-small">
<p>{lead.Name}</p>
</lightning-layout-item>
<lightning-layout-item padding="around-small">
<p>{lead.Title}</p>
</lightning-layout-item>
<lightning-layout-item padding="around-small">
<p>{lead.Company}</p>
</lightning-layout-item>
</lightning-layout>
</template>
And here is the JavaScript for that component. It will use the api decorator since the lead that is passed to it is a public property.
import { LightningElement, api } from 'lwc';
export default class LeadListItem extends LightningElement {
@api lead;
}
So that is all we have for now. If you push all the code we have here and go to do a search, you should see the term you type displayed right below it, but not much else is happening yet. But stay tuned for the next post, because that is where all the magic will happen and the solution will come together.
This is the second course I am doing on LWC, and, although, I totally understand the nesting concept, the purpose of the .html, .js and .index files as well as the concept of Parent and child components, where I struggle, is with the details of the coding within e.g some of the methods, call-back functions etc.
So, what I need to know is;
1. Will your course overcome this and give us interactive opportunity to practice practice practice until it’s embedded in our brain?
2. What is the difference between LWC and Lightning Componets within the Aura Framework?
3. Is Aura going to be the ‘old way’ in future because LWC is more flexible and powerful?
1.) I can’t promise that my course will teach you everything about LWC’s. But, I do use a certain approach that I think will be effective. Whether or not it is, depends on the person I guess.
2.) LWC are Lightning components, just another flavor. But, so are Aura components.
3.) I do not work for Salesforce anymore, so I cannot answer that, but I would suspect it is. I definitely think all the good resources are going towards LWC and that is the future of web development for Salesforce right now (at least). IN 5 years, it will probably be something else. That is the world of technology.