闪电Web组件和Salesforce数据 – 使用闪电数据服务来处理数据

学习目标 

完成本单元后,您将能够:

  • 构建包含lightning-record-*-form基础组件的解决方案。
  • 使用闪电数据服务(LDS)线适配器读取数据。
  • 使用LDS功能修改数据。

如果这是您首次尝试Lightning Web Components,请等待。退后一步。在完成本模块之前,请确保您完成了 Lighthead Web Components基础知识 模块,并且 在Trailhead上了解了如何使用JavaScript。您在此处所做的工作基于此处的概念和工作。

在Lightning Web Components中使用数据

在Lightning Web组件中,有几种使用Salesforce数据的方法。知道针对特定用例使用哪种解决方案,可使您编写更少的代码,更简单的代码以及更易于维护的代码。针对每种情况使用最佳解决方案还可以提高组件和应用程序的性能。

在本模块中,您将学习何时以及如何使用不同的解决方案。我们将首先审查最简单但可定制性最少的选项。稍后,我们考虑更复杂和更可定制的选项。

使用Lightning数据服务处理数据

Lightning Data Service是使用Salesforce数据的首选(也是最简单)方式。借助Lightning Data Service,开发人员可以使用JavaScript将组件连接到Salesforce数据。

Lightning Data Service还通过对安全的用户界面API端点进行服务器调用来提供安全性。通过在所有组件之间使用客户端共享缓存,Lightning Data Service可以最大化性能。缓存记录时,将从缓存中检索记录,从而消除了对服务器的不必要调用。

Lightning Data Service在整个应用程序生命周期内跨多个组件和客户端维护一致的最新数据。如果多个组件使用Lightning Data Service处理记录,并且其中一个更新记录,则其他组件将自动反映该更新。

在以下各节中,我们重点介绍了使用Lightning Data Service处理Salesforce数据的不同方法。

使用记录表单基础组件读取或修改数据

在Lightning Web组件中使用单个记录的最简单方法是使用这些lightning-record-*-form组件。这些基本组件在后台使用Lightning Data Service,并继承其缓存和同步功能。每个基本组件都为您提供了不同的功能和自定义级别。

  • lightning-record-form基本组件是最简单的组件。使用lightning-record-form,您可以指定布局,并允许管理员声明性地配置表单字段。您还可以指定字段的有序列表,以编程方式定义显示的内容。lightning-record-form允许您查看和编辑记录。
  • lightning-record-view-form基本组件使您可以查看记录。
  • lightning-record-edit-form基本组件允许您编辑记录。

选择lightning-record-view-form或者lightning-record-edit-form当你需要自定义表单布局,预填充字段值,或变更记录数据的呈现方式。

这是lightning-record-form用于创建帐户的示例。

accountCreator.html

<template>
    <lightning-card>
        <lightning-record-form
            object-api-name={objectApiName}
            fields={fields}
            onsuccess={handleSuccess}>
        </lightning-record-form>
    </lightning-card>
</template>

accountCreator.js

import { LightningElement } from 'lwc';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import ACCOUNT_OBJECT from '@salesforce/schema/Account';
import NAME_FIELD from '@salesforce/schema/Account.Name';
import REVENUE_FIELD from '@salesforce/schema/Account.AnnualRevenue';
import INDUSTRY_FIELD from '@salesforce/schema/Account.Industry';
export default class AccountCreator extends LightningElement {
    objectApiName = ACCOUNT_OBJECT;
    fields = [NAME_FIELD, REVENUE_FIELD, INDUSTRY_FIELD];
    handleSuccess(event) {
        const toastEvent = new ShowToastEvent({
            title: "Account created",
            message: "Record ID: " + event.detail.id,
            variant: "success"
        });
        this.dispatchEvent(toastEvent);
    }
}

代码重点:

accountCreator.html 

  • 第3行:通过lightning-record-form在标记中使用,我们可以获得Lightning Data Service提供的所有安全性和性能优势。当lightning-record-form未指定时recordId,它将以edit模式运行,并在提交时创建一条记录。
  • 第4行:绑定object-api-name属性指示要加载的对象的类型。
  • 第5行:绑定fields属性指示要在表单中显示的字段。
  • 第6行:我们设置handleSuccesssuccess事件的处理程序。

accountCreator.js 

  • 第3至6行:在文件的开头,我们导入对Account对象及其字段的引用。以这种方式引用对象和字段可确保引用完整性。Salesforce会验证对象和字段是否存在,防止它们被删除,并确保它们包含在引用该组件的变更集和程序包中。导入对象和字段引用可确保如果重命名对象或字段,组件代码仍然可以正常工作。
  • 第10行:我们为handleSuccess事件定义事件处理程序successhandleSuccess保存操作成功时执行。
  • 第11至17行:我们通过firing显示一条敬酒消息ShowToastEvent,其中event.detail.idid对新创建的记录的属性的引用。

如果您需要的自定义功能超出了lightning-record-*-form组件提供的功能,则可以使用电线适配器或JavaScript函数直接调用Lightning Data Service。 

使用LDS线适配器读取数据

LDS线适配器 是使用Salesforce数据的另一种方法。使用有线适配器读取Salesforce数据(记录)和元数据(布局详细信息,对象上的字段,等等)。要使用它们,请用装饰一个属性或函数@wire 并指定电线适配器。

LDS有线适配器首先检查LDS缓存,并仅在需要时才从服务器请求数据。适配器会相应地更改和刷新数据。例如,当参数值更改或其他组件修改了Lightning Data Service缓存中的数据时,适配器会将新数据置备到有线属性或功能。

我们来看一个使用getRecord线适配器的示例 。

wireGetRecordProperty.js

import { LightningElement, api, wire } from 'lwc';
import { getRecord } from 'lightning/uiRecordApi';
import ACCOUNT_NAME_FIELD from '@salesforce/schema/Account.Name';
export default class WireGetRecordProperty extends LightningElement {
    @api recordId;
    @wire(getRecord, { recordId: '$recordId', fields: [ACCOUNT_NAME_FIELD] })
    account;
}

代码重点:

  • 第2行:我们导入getRecord电线适配器。
  • 第3行:就像在accountCreator示例中所做的一样,我们导入对该Account.Name字段的引用。(在第6行中,我们用它告诉getRecord电线适配器要检索的字段。)
  • 第5行:将wireGetRecordProperty组件放置在记录页面上时,@api recordId让父组件( FlexiPage)将当前记录的ID传递给该组件。
  • 第6行:要关联account属性,我们应用@wire装饰器并指定要调用的关联适配器(getRecord),以及适配器所需的参数(recordIdfields)。
  • 第7行:电线适配器为account属性设置了一个值流,该值流将被多次设置。如果检索到一条记录,则将其存储在中account.data。如果记录检索失败,则错误存储在中 account.error
  • 第6-7行:第一次将值分配给recordId属性时,有线适配器从服务器获取数据,并将其存储在LDS缓存中以备将来访问。通过将recordId参数作为带有$前缀的字符串传递,我们可以进行recordId反应。每次recordId更改值时,有线适配器都会从缓存或服务器中获取新数据。如果另一个组件修改了缓存的记录,则有线适配器将记录的新值分配给account属性。

wireGetRecordProperty是装饰属性的示例。我们可以 用相同的方式装饰一个函数。当您要对返回的记录执行一些逻辑时,这很有用。这是前面的示例(wireGetRecordProperty),其经过重新设计以连接函数(wiredAccount)而不是属性。

wireGetRecordFunction.js

import { LightningElement, api, wire } from 'lwc';
import { getRecord } from 'lightning/uiRecordApi';
import ACCOUNT_NAME_FIELD from '@salesforce/schema/Account.Name';
export default class WireGetRecord extends LightningElement {
    @api recordId;
    data;
    error;
    @wire(getRecord, { recordId: '$recordId', fields: [ACCOUNT_NAME_FIELD] })
    wiredAccount({data, error}) {
        console.log('Execute logic each time a new value is provisioned');
        if (data) {
            this.data = data;
            this.error = undefined;
        } else if (error) {
            this.error = error;
            this.data = undefined;
        }
    }
}

代码重点:

  • 第8-9行:我们不是装饰属性,而是装饰wiredAccount函数。该函数接收具有两个属性的对象作为参数:dataerror。我们使用对象 ES6解构 来解压缩对象属性。
  • 第11-17行:由于LDS线适配器不是提供单个值而是提供值流,因此wiredAccount可以多次调用该函数。结果,有线功能必须重置其影响的状态。因此,在这里,在第11至17行中,如果有线适配器提供了新数据,我们会将数据存储在data属性中,并将error属性设置为undefined。另外,如果有错误,我们会将错误存储在error属性中,并将data属性设置为undefined。

使用LDS功能修改数据

LDS线适配器非常适合读取数据,但是要创建,更新或删除记录,您需要LDS功能。请注意,尽管Lightning Web Components引擎调用了有线适配器,但是您必须强制调用函数。当创建,更新或删除记录时,LDS功能会通知LDS缓存。考虑以下示例,该示例使用createRecord LDS函数创建帐户记录。

ldsCreateRecord.js

import { LightningElement} from 'lwc';
import { createRecord } from 'lightning/uiRecordApi';
import ACCOUNT_OBJECT from '@salesforce/schema/Account';
import ACCOUNT_NAME_FIELD from '@salesforce/schema/Account.Name';
export default class LdsCreateRecord extends LightningElement {
    handleButtonClick() {
        const recordInput = {
            apiName: ACCOUNT_OBJECT.objectApiName,
            fields: {
                [ACCOUNT_NAME_FIELD.fieldApiName] : 'ACME'
            }
        };
        createRecord(recordInput)
            .then(account => {
                // code to execute if create operation is successful
            })
            .catch(error => {
                // code to execute if create operation is not successful
            });
    }
}

代码重点:

  • 第2行:导入createRecordLDS功能。
  • 第3至4行:导入Account对象和Account.Name字段(与前面的示例一样),以确保引用完整性。
  • 第6行:我们将handleButtonClick方法定义为事件处理程序。它响应用户单击lightning-button.html文件(未显示)中的a时发生的事件。当handleButtonClick被调用时,它将createRecord强制调用该函数。
  • 第10行:我们的事件处理程序为该Account.Name字段传递了一个字符串,适配器需要使用该字符串来创建一个新帐户。
  • 第13行:当我们强制性地调用LDS函数时,它将返回一个promise(简化执行异步调用的JavaScript对象)。
  • 第14至16行:在then方法中,我们定义了成功创建帐户后会发生的情况。
  • 第17-19行:在catch方法中,我们定义了如果帐户创建失败将发生的情况。

注意:  LDS功能仅允许您处理单个记录。尽管可以在同一组件中使用多个功能(例如,在同一操作中创建两种不同类型的记录),但是每个功能都在其自己的独立事务上运行。因此,没有通用的回滚逻辑。如果需要合并的DML操作进行事务处理,请考虑使用Apex。

要了解有关LDS电线适配器和功能以及如何使用它们的更多信息,请访问Lightning Web Components开发人员指南Salesforce开发人员博客

部署创建帐户的Lightning Web组件

现在,我们已经研究了使用Lightning Data Service的不同方法,下面我们来看一个示例。

在你开始之前

我们假设您已经设置了Salesforce DX开发环境,并且可以轻松地使用它来创建Lightning Web组件并将其部署到组织中。如果您还不熟悉此过程,请完成“快速入门:Lightning Web Components”项目。

创建一个新的Trailhead游乐场

对于此项目,您需要创建一个新的Trailhead Playground。滚动到该页面的底部,单击“启动”旁边的向下箭头,然后选择“创建Trailhead游乐场”。创建新的Trailhead游乐场通常需要3-4分钟。

注意: 是的,我们的意思是全新的Trailhead游乐场!如果您使用现有的组织或游乐场,则可能会遇到无法完成挑战的问题。

获取您的Trailhead Playground用户名和密码

转到您的Trailhead游乐场。(如果尚未打开,请滚动至该页面的底部,然后单击启动。)如果您在组织中看到一个标签为Get Your Login Credentials的标签,太好了!跳至步骤1。 

否则,请从应用启动器(应用启动器)中找到并打开Playground Starter, 然后按照以下步骤操作。如果您没有看到Playground Starter应用程序,请在Trailhead帮助中签出查找Trailhead Playground的用户名和密码

  1. 单击获取您的登录凭据 选项卡,并记下您的用户名。
  2. 单击重置我的密码。这会将电子邮件发送到与您的用户名关联的地址。
  3. 单击电子邮件中的链接。
  4. 输入新密码,确认,然后单击更改密码

准备好动手了吗?我们走吧。

在本练习中,您将Lightning Web组件添加到项目中,然后将其部署到Trailhead Playground。 

  1. 创建一个新项目:
    1. 打开Visual Studio代码。
    2. 打开命令面板:单击查看命令面板
    3. 在命令面板中,选择SFDX:创建项目
      如果您没有在列表中看到它,请键入SFDX: Create Project,然后按Enter
    4. 接受标准模板。
    5. 输入项目名称,workingWithDataInLWC然后按Enter
    6. 选择新项目的位置,然后单击“创建项目”
  2. 授权您的Trailhead游乐场:
    1. 在命令选项板中,选择(或输入)SFDX:授权组织
    2. 选择生产:login.salesforce.com,然后按Enter
    3. 对于别名,请输入lwc_and_salesforce_data,然后按Enter
    4. 使用您的Trailhead Playground用户名和密码登录。
    5. 登录到Trailhead Playground后,将其保持打开状态并返回到Visual Studio Code。
  3. 创建一个闪电Web组件:
    1. 在“资源管理器”窗格中,右键单击lwc文件夹,然后选择“ SFDX:创建闪电Web组件”
    2. 输入组件名称,accountCreator然后按Enter键
    3. 再次按Enter接受默认目录。
  4. 用 本单元前面的“使用记录表单基础组件读取或修改数据”部分中提供的代码替换accountCreator.html和accountCreator.js文件的内容。
  5. 要使此组件在组织中的应用程序页面上可用,请使用以下代码替换accountCreator.js-meta.xml文件的内容:
    <?xml version="1.0" encoding="UTF-8"?>
    <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
        <apiVersion>48.0</apiVersion>
        <isExposed>true</isExposed>
        <targets>
            <target>lightning__AppPage</target>
        </targets>
    </LightningComponentBundle>
  6. 保存三个文件:accountCreator.html,accountCreator.js和accountCreator.js-meta.xml。
  7. 将项目文件部署到您的Trailhead Playground。(右键单击accountCreator文件夹,然后选择“ SFDX:将源部署到组织”。)
  8. 如果您的Trailhead Playground尚未打开,请打开它。(在命令选项板中,选择(或输入)  SFDX:Open Default Org)。
  9. 在您的Trailhead游乐场中,单击 设定,然后选择设置
  10. 在“快速查找”框中,输入Lightning App Builder,然后选择Lightning App Builder
  11. 创建一个闪电页面:
    1. 点击新建
    2. 选择应用程序页面 ,然后单击下一步
    3. 对于标签,输入Working with Data,然后单击下一步
    4. 对于布局,选择Header和Left Sidebar
    5. 点击完成
  12. accountCreator组件拖到页面侧栏。
  13. 保存页面。
  14. 激活页面:保留默认的应用名称(使用数据),然后点击保存
  15. 当提示您将页面添加到导航菜单时,点击完成
  16. 打开新页面:在App Launcher搜索中,输入work,然后选择使用数据

而已。您具有一个Lightning Web组件,该组件用于lightning-record-form在“使用数据”页面上创建帐户记录。使用Lightning Data Service是在Lightning Web组件中使用Salesforce数据的一种方法。在下一单元中,您将学习如何使用Apex处理数据。

闪电Web组件基础 – 将样式和数据添加到Lightning Web组件

学习目标

完成本单元后,您将能够:

  • 将CSS和Lightning Design System与组件一起使用。
  • 从Salesforce组织获取数据。
  • 将您的应用程序部署到组织并进行测试。

调整组件

我们几乎结束了对Lightning Web组件的介绍,但让我们来看看如何控制组件的外观并提取实时数据。我们可以使外观适应Lightning环境,并在组织中使用实时数据。在本单元中,我们将使某些文本看起来生动活泼,并从您的组织中的记录中动态绘制一个帐户名。

使用上一个单元中的Bike Selector App文件来完成此操作。

CSS和组件样式

用于闪电Web组件的CSS的实现遵循 W3C标准。您可以在CSS文件中创建样式表,该样式表会自动应用于相应的HTML文件。

Lightning Web Components封装了组件,使它们与全局DOM分开。我们通过称为Shadow DOM的机制来完成此操作。Shadow DOM是一种常见的实现,它允许组件的元素位于DOM的“子树”中(在参考资料部分提供的链接中了解有关Shadow DOM的更多信息)。该组件可以将其外观和行为保留在其他应用程序中或作为另一个组件的子代。

例如,让我们设置一辆自行车的价格,使其显示为绿色粗体。将以下.price条目添加 到detail.css 文件。

body{
  margin: 0;
}
.price {
  color: green;
  font-weight: bold;
}

部署文件。

提示

您可以右键单击detail文件夹以仅部署新文件,而无需等待整个项目的部署。

在组织中,您可能需要刷新页面以查看更改,以防被缓存。然后,当您选择一辆自行车时,价格为绿色和粗体。

价格样式使文本变为绿色和粗体。

应用闪电设计系统样式

Salesforce闪电设计系统(SLDS)是一个CSS框架,提供与Lightning Experience一致的外观。位于Lightning Experience或Salesforce移动应用程序中的Lightning Web组件可以使用SLDS,而无需任何导入语句或静态资源。

例如,您可以使用SLDS标题样式来提供细节组件文本,该文本看起来更像标准的Lightning文本。更新detail.html 文件以使用 slds-text-heading_small和 slds-text-heading_medium字体设置,如下所示。

<template>
    <template if:true={product}>
    <div class="container">
        <div class="slds-text-heading_small">{product.fields.Name.value}</div>
        <div class="price">{product.fields.MSRP__c.displayValue}</div>
        <div class="description">{product.fields.Description__c.value}</div>
        <img class="product-img" src={product.fields.Picture_URL__c.value}></img>
        <p>
            <lightning-badge label={product.fields.Material__c.value}></lightning-badge>
            <lightning-badge label={product.fields.Level__c.value}></lightning-badge>
        </p>
        <p>
            <lightning-badge label={product.fields.Category__c.value}></lightning-badge>
        </p>
    </div>
    </template>
    <template if:false={product}>
    <div class="slds-text-heading_medium">Select a bike</div>
    </template>
</template>

部署文件。

现在,尝试在组织中使用该组件,看看有什么不同(您需要刷新页面)。

已应用SLDS标题字体处理。

看起来很棒!现在我们已经准备好外观。但是到目前为止,我们一直在使用从数据组件中提取的静态数据。让我们在页面上添加更多闪亮的东西…动态数据。

获取Salesforce数据

毕竟,这是一个Salesforce应用程序,您真正想要的是能够从Salesforce组织中提取动态数据。Lightning Web组件使用基于Lightning Data Service构建的电抗线服务。我们将通过一个示例将一个帐户名动态地拉入我们的应用程序。

Wire Service将数据带到您的应用程序

有线服务是我们平台的一部分,可提供数据流。@wire我们前面已经简要提到过的装饰器为您的应用程序实现了有线服务。要使用有线服务,请执行以下操作。

  1. 在JavaScript文件中导入电线适配器。
  2. 用装饰器装饰属性或函数@wire

这是语法。

import { adapterId } from 'adapter-module';
@wire(adapterId, adapterConfig)
propertyOrFunction;
  • adapterId (标识符)-电线适配器的标识符。
  • adapter-module (字符串)-包含电线适配器功能的模块的标识符。
  • adapterConfig (对象)-专用于电线适配器的配置对象。
  • propertyOrFunction—从有线服务接收数据流的私有财产或功能。如果属性用@wire装饰,则结果将返回到属性的data属性或error属性。如果函数使用@wire装饰,则结果将在具有data属性和error属性的对象中返回。

这是将其添加到 我们一直在致力于从组织中提取当前用户名的项目中的selector.js文件中的方法。

import { LightningElement, wire } from 'lwc';
import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
import Id from '@salesforce/user/Id';
import NAME_FIELD from '@salesforce/schema/User.Name';
const fields = [NAME_FIELD];
export default class Selector extends LightningElement {
    selectedProductId;
    handleProductSelected(evt) {
        this.selectedProductId = evt.detail;
    }
    userId = Id;
    @wire(getRecord, { recordId: '$userId', fields })
    user;
    get name() {
        return getFieldValue(this.user.data, NAME_FIELD);
    }
}

您还可以通过编辑selector.html 文件以包含名称的方式来进行尝试。例如:

<template>
    <div class="wrapper">
    <header class="header">Available Bikes for {name}</header>
    <section class="content">
        <div class="columns">
        <main class="main" >
            <c-list onproductselected={handleProductSelected}></c-list>
        </main>
        <aside class="sidebar-second">
            <c-detail product-id={selectedProductId}></c-detail>
        </aside>
        </div>
    </section>
    </div>
</template>

将选择器组件文件部署到组织中时(确保部署中包括选择器文件),应该看到以下名称,而不是Mary Jones。您可能需要刷新页面。

用户界面中动态加载的用户名。

结论

这仅仅是开始,您可以使用Lightning Web Components模型做很多事情。该模型包括对测试,安全性,Apex集成等的支持。继续探索,尝试新事物,继续建设。随着W3C Web组件标准的发展,我们的模型也将随之发展。

Lightning Web组件的未来之路。

闪电Web组件基础 – 处理Lightning Web Components中的事件

学习目标

完成本单元后,您将能够:

  • 创建一个包含多个组件的应用程序。
  • 描述复杂组件的文件结构。
  • 处理事件。

跟随活动的旅程

您已经构建了一个组件并将其推送到临时组织。让我们开始添加一些与事件处理的交互性。我们通过几个组件跟踪事件的旅程,以在应用程序中进行复杂的事件处理。此应用程序是自行车商店的产品选择器。用户单击自行车名称和图像以查看更多详细信息。

自行车选择器组件。

这个程序有四个组件一起工作。

  1. tile:显示单个项目。
  2. list:排列瓷砖。
  3. detail:单击磁贴时显示项目详细信息(类似于您刚创建的bikeCard)。
  4. 选择器:包含整个组件集。容器组件不是必需的,但是我们在这里使用一个容器组件来帮助处理事件。

目前,该应用程序使用数据文件来加载静态数据以进行测试。在下一单元中,您将学习如何从组织中提取动态数据。

成分组成

让我们将一些文件添加到我们的项目中,然后将其部署到组织中。

  1. 在此处下载此应用程序的文件: Trailhead的Bike Selector应用程序
  2. 将文件解压缩到bikeCard项目的lwc文件夹中。自行车选择器应用程序文件结构。

组件关系

在此应用中,多个组件可以协同工作;一些组件嵌套在其他组件内部。正如您将HTML元素彼此嵌套一样,作为自定义HTML元素的Lightning Web组件也可以嵌套在其他Lightning Web组件内。

在我们的文件系统中,组件的文件夹实际上并不能深入了解它们之间的关系。

让我们看看图中的组件如何嵌套在UI级别上。

自行车选择器应用程序组件的父/子关系。

选择器组件对页面进行布局,并呈现列表和详细信息组件。list组件呈现了多个tile组件,数据中的每辆自行车一个。

<template>
    <div class="wrapper">
    <header class="header">Available Bikes</header>
    <section class="content">
        <div class="columns">
        <main class="main" >
            <c-list onproductselected={handleProductSelected}></c-list>
        </main>
        <aside class="sidebar-second">
            <c-detail product-id={selectedProductId}></c-detail>
        </aside>
        </div>
    </section>
    </div>
</template>

如果您查看detail.html,则会看到条件渲染。如果未从列表中选择任何内容,那么将显示一条消息,要求用户选择某些内容。如果选择了某些内容,它将显示自行车信息。

<template>
    <template if:true={product}>
        <div class="container">
            <div>{product.fields.Name.value}</div>
            <div class="price">{product.fields.MSRP__c.displayValue}</div>
            <div class="description">{product.fields.Description__c.value}</div>
            <img class="product-img" src={product.fields.Picture_URL__c.value}></img>
            <p>
                <lightning-badge label={product.fields.Material__c.value}></lightning-badge>
                <lightning-badge label={product.fields.Level__c.value}></lightning-badge>
            </p>
            <p>
                <lightning-badge label={product.fields.Category__c.value}></lightning-badge>
            </p>
        </div>
    </template>
    <template if:false={product}>
        <div>Select a bike</div>
    </template>
</template>

嵌套是在HTML中为每个父组件实现的。例如,list组件具有以下HTML,其中包括tile组件为c-tile

<template>
    <div class="container">
        <template for:each={bikes} for:item="bike">
            <c-tile
                key={bike.fields.Id.value}
                product={bike}
                ontileclick={handleTileClick}>
            </c-tile>
        </template>
    </div>
</template>

请注意,自行车项目的每次迭代如何生成新的图块组件。简单地包括c-tilecomponent标记即可使每个tile组件成为其子级。div类定义“容器”用于样式设置,因此您可以控制图块的排列。如果查看list.css,则会看到它包装了内容。

.container {
   display: flex;
   flex-direction: row;
   flex-wrap: wrap;
}

父子关系不仅对于应用程序的设计很重要,而且对于事件处理也很重要。

让我们更深入地了解事件处理。

事件增加,属性减少

在一个复杂的组件(一个包含多个父组件和子组件)中,这些组件可以上下通信。

父子组件上下传递信息。

  1. c-todo-item子组件将事件调度到父c-todo-app组件。例如,当用户单击按钮时,子级可以将事件对象传递给父级,以便父级可以处理事件并更改当前页面。
  2. c-todo-app父组件在子组件中传递属性或调用方法。例如,父级可以在子级组件中设置文本值,或在子级组件中调用方法。

让我们看看这种交流是如何工作的。

传递信息

可以使用事件和 事件侦听器传递信息 。

子组件调度事件,父组件监听事件。调度事件包括创建一个事件对象,孩子可以将该事件对象传递给父组件。父级具有处理程序以响应事件。

例如,像这样的子组件包含一个nextHandler()方法,该方法使用创建一个简单的事件对象,CustomEvent()并在用户单击“下一步”按钮时分派next值。

// todoItem.js
import { LightningElement } from 'lwc';
...
    nextHandler() {
        this.dispatchEvent(new CustomEvent('next'));
    }
}

父组件侦听该事件。

<!– todoApp.html -->
<template>
    <c-todo-item onnext={nextHandler}></c-child>
</template>

并将事件对象传递给事件处理程序。

// todoApp.js
import { LightningElement } from 'lwc';
export default class TodoApp extends LightningElement {
...
nextHandler(){
        this.page = this.page + 1;
    }
}

传递信息

可以使用公共属性和 公共方法来传递信息 。

您可以通过在@api装饰器前面添加组件属性来使其公开。然后,通过外部组件设置公共属性。

例如,如果c-todo-item子组件具有以下内容:

// todoItem.js
import { LightningElement, api } from 'lwc';
export default class TodoItem extends LightningElement {
   @api itemName;
}

使用以下命令设置父项的值:

<!– todoApp.html -->
<template>
    <c-todo-item item-name="Milk"></c-todo-item>
</template>

公共属性是传递原始值,简单对象和数组的绝佳解决方案。

另外,可以 在获取或设置属性时使用getter和setter来执行一些逻辑。并记住,用@api装饰器注释它们,以使其对其他组件公开。

同样,您可以创建可从父组件调用的公共方法。通过使用@api装饰器定义子组件,在子组件中创建一个公共方法,然后从父组件中调用它。

假设我们有一个像这样的子组件。

// videoPlayer.js
import { LightningElement, api } from 'lwc';
export default class VideoPlayer extends LightningElement {
   @api
   play() {
       // Play music!
   }
}

当c-video-player组件包含在父组件中时,我们可以像这样从父组件调用方法:

// methodCaller.js
import { LightningElement } from 'lwc';
export default class MethodCaller extends LightningElement {
   handlePlay() {
      this.template.querySelector('c-video-player').play();
   }
}

我们定义了一种handlePlay()触发事件的方法。然后,我们使用querySelector()DOM方法搜索名为c-video-player的DOM元素并调用其公共方法。

用HTML处理事件

因此,我们的选择器应用程序需要处理一种类型的事件-用户单击磁贴。发生这种情况时,详细信息组件应使用相关图块中的信息重新呈现。您可以处理HTML中的事件(在模板中添加事件侦听器)或JavaScript(编写事件侦听器函数)。我们建议使用HTML方法,如下所示。

每个图块组件都侦听用户单击,因为图块组件的HTML(tile.html)包含onclick事件侦听器。

<template>
    <div class="container">
        <a onclick={tileClick}>
            <div class="title">{product.fields.Name.value}</div>
            <img class="product-img" src={product.fields.Picture_URL__c.value}></img>
        </a>
    </div>
</template>

当用户单击UI中的一个tile实例时,onclick侦听器将调用tileClicktile.js JavaScript文件中的处理程序函数。

import { LightningElement, api } from 'lwc';
export default class Tile extends LightningElement {
    @api product;
    tileClick() {
        const event = new CustomEvent('tileclick', {
            // detail contains only primitives
            detail: this.product.fields.Id.value
        });
        // Fire the event from c-tile
        this.dispatchEvent(event);
    }
}

选择器应用程序事件模式

在产品选择器应用程序中,我们使用一个复杂的组件(一个组件包含多个父组件和子组件),建议您通过组件层次结构向上传播事件,以便父组件可以响应子事件。如果您还有其他子组件(而不是引发事件的子组件),则可以将属性传递给这些子组件以响应事件。

该模式如下所示:

事件流通过组件层次结构。

为此,我们需要将事件侦听器和处理程序按层次结构链接到ebikes组件。然后将一个属性传递到详细信息组件。

在我们的示例文件中,您将看到以下内容。

  1. tile.html具有onclick事件侦听器,该事件侦听器调用tileClick处理程序。
  2. tile.js具有tileClick创建包含细节值(this.product.fields.Id.value)的新CustomEvent对象的方法。
  3. List.html具有ontileClick调用handleTileClick处理程序的侦听器。
  4. List.js具有handleTileClick创建另一个evt也包含详细信息值的事件对象()的方法。并使用JavaScript调度事件:
    // Fire the event from c-list
    this.dispatchEvent(event);
  5. 选择器.html具有onproductselected调用handleProductSelected处理程序的事件侦听器。
  6. selector.js将handleProductSelected方法设置selectedProductId为该evt.detail值。
  7. detail.html具有等待产品值的条件指令(还记得单元2中的指令)吗:
    <template if:true={product}>
  8. detail.js将各个部分组合在一起。它创建一个私有variable _productId来跟踪productId值的状态。然后,它使用获取/设置模式获取值并将其设置为私有变量产品,该产品可以让detail.html加载条件内容。

Getter和Setter是常见的JavaScript结构。它们使您可以向属性分配添加逻辑和条件。

import { LightningElement, api } from 'lwc';
import { bikes } from 'c/data';
export default class Detail extends LightningElement {
    product;
    // Private var to track @api productId
    _productId = undefined;
    // Use set and get to process the value every time it's
    // requested while switching between products
    set productId(value) {
        this._productId = value;
        this.product = bikes.find(bike => bike.fields.Id.value === value);
    }
    // getter for productId
    @api get productId(){
        return this._productId;
    }
}

每次单击磁贴时,此过程都会重复进行。

注意

事件具有管理事件在DOM树上传播的属性。您可以在配置事件传播中了解有关它们的更多信息 。更改默认值是为了进行高级事件处理,并且需要进行测试以确保预期的行为。

将文件部署到组织

让我们将这些文件部署到启用了Dev Hub的组织中,以了解其工作原理。使用在上一个单元中执行的相同步骤,部署新文件,打开组织,并使用此应用程序在Lightning App Builder中创建页面。

  1. 要部署项目文件,请右键单击默认文件夹,然后选择SFDX:从VS Code中的命令面板中将源部署到组织
  2. 要打开您的组织,请使用SFDX:在VS Code中从命令面板打开默认组织
  3. 在设置中,在快速查找框中输入Lightning App Builder,然后选择Lightning App Builder
  4. 点击新建
  5. 使用选择器组件创建一个区域页面。

您将拥有一个完全交互式的页面,其中包含多个相互配合的组件。接下来,我们尝试样式化并从组织获取实时数据。

闪电Web组件基础 – 处理Lightning Web Components中的事件

学习目标

完成本单元后,您将能够:

  • 创建一个包含多个组件的应用程序。
  • 描述复杂组件的文件结构。
  • 处理事件。

跟随活动的旅程

您已经构建了一个组件并将其推送到临时组织。让我们开始添加一些与事件处理的交互性。我们通过几个组件跟踪事件的旅程,以在应用程序中进行复杂的事件处理。此应用程序是自行车商店的产品选择器。用户单击自行车名称和图像以查看更多详细信息。

自行车选择器组件。

这个程序有四个组件一起工作。

  1. tile:显示单个项目。
  2. list:排列瓷砖。
  3. detail:单击磁贴时显示项目详细信息(类似于您刚创建的bikeCard)。
  4. 选择器:包含整个组件集。容器组件不是必需的,但是我们在这里使用一个容器组件来帮助处理事件。

目前,该应用程序使用数据文件来加载静态数据以进行测试。在下一单元中,您将学习如何从组织中提取动态数据。

成分组成

让我们将一些文件添加到我们的项目中,然后将其部署到组织中。

  1. 在此处下载此应用程序的文件: Trailhead的Bike Selector应用程序
  2. 将文件解压缩到bikeCard项目的lwc文件夹中。自行车选择器应用程序文件结构。

组件关系

在此应用中,多个组件可以协同工作;一些组件嵌套在其他组件内部。正如您将HTML元素彼此嵌套一样,作为自定义HTML元素的Lightning Web组件也可以嵌套在其他Lightning Web组件内。

在我们的文件系统中,组件的文件夹实际上并不能深入了解它们之间的关系。

让我们看看图中的组件如何嵌套在UI级别上。

自行车选择器应用程序组件的父/子关系。

选择器组件对页面进行布局,并呈现列表和详细信息组件。list组件呈现了多个tile组件,数据中的每辆自行车一个。

<template>
    <div class="wrapper">
    <header class="header">Available Bikes</header>
    <section class="content">
        <div class="columns">
        <main class="main" >
            <c-list onproductselected={handleProductSelected}></c-list>
        </main>
        <aside class="sidebar-second">
            <c-detail product-id={selectedProductId}></c-detail>
        </aside>
        </div>
    </section>
    </div>
</template>

如果您查看detail.html,则会看到条件渲染。如果未从列表中选择任何内容,那么将显示一条消息,要求用户选择某些内容。如果选择了某些内容,它将显示自行车信息。

<template>
    <template if:true={product}>
        <div class="container">
            <div>{product.fields.Name.value}</div>
            <div class="price">{product.fields.MSRP__c.displayValue}</div>
            <div class="description">{product.fields.Description__c.value}</div>
            <img class="product-img" src={product.fields.Picture_URL__c.value}></img>
            <p>
                <lightning-badge label={product.fields.Material__c.value}></lightning-badge>
                <lightning-badge label={product.fields.Level__c.value}></lightning-badge>
            </p>
            <p>
                <lightning-badge label={product.fields.Category__c.value}></lightning-badge>
            </p>
        </div>
    </template>
    <template if:false={product}>
        <div>Select a bike</div>
    </template>
</template>

嵌套是在HTML中为每个父组件实现的。例如,list组件具有以下HTML,其中包括tile组件为c-tile

<template>
    <div class="container">
        <template for:each={bikes} for:item="bike">
            <c-tile
                key={bike.fields.Id.value}
                product={bike}
                ontileclick={handleTileClick}>
            </c-tile>
        </template>
    </div>
</template>

请注意,自行车项目的每次迭代如何生成新的图块组件。简单地包括c-tilecomponent标记即可使每个tile组件成为其子级。div类定义“容器”用于样式设置,因此您可以控制图块的排列。如果查看list.css,则会看到它包装了内容。

.container {
   display: flex;
   flex-direction: row;
   flex-wrap: wrap;
}

父子关系不仅对于应用程序的设计很重要,而且对于事件处理也很重要。

让我们更深入地了解事件处理。

事件增加,属性减少

在一个复杂的组件(一个包含多个父组件和子组件)中,这些组件可以上下通信。

父子组件上下传递信息。

  1. c-todo-item子组件将事件调度到父c-todo-app组件。例如,当用户单击按钮时,子级可以将事件对象传递给父级,以便父级可以处理事件并更改当前页面。
  2. c-todo-app父组件在子组件中传递属性或调用方法。例如,父级可以在子级组件中设置文本值,或在子级组件中调用方法。

让我们看看这种交流是如何工作的。

传递信息

可以使用事件和 事件侦听器传递信息 。

子组件调度事件,父组件监听事件。调度事件包括创建一个事件对象,孩子可以将该事件对象传递给父组件。父级具有处理程序以响应事件。

例如,像这样的子组件包含一个nextHandler()方法,该方法使用创建一个简单的事件对象,CustomEvent()并在用户单击“下一步”按钮时分派next值。

// todoItem.js
import { LightningElement } from 'lwc';
...
    nextHandler() {
        this.dispatchEvent(new CustomEvent('next'));
    }
}

父组件侦听该事件。

<!– todoApp.html -->
<template>
    <c-todo-item onnext={nextHandler}></c-child>
</template>

并将事件对象传递给事件处理程序。

// todoApp.js
import { LightningElement } from 'lwc';
export default class TodoApp extends LightningElement {
...
nextHandler(){
        this.page = this.page + 1;
    }
}

传递信息

可以使用公共属性和 公共方法来传递信息 。

您可以通过在@api装饰器前面添加组件属性来使其公开。然后,通过外部组件设置公共属性。

例如,如果c-todo-item子组件具有以下内容:

// todoItem.js
import { LightningElement, api } from 'lwc';
export default class TodoItem extends LightningElement {
   @api itemName;
}

使用以下命令设置父项的值:

<!– todoApp.html -->
<template>
    <c-todo-item item-name="Milk"></c-todo-item>
</template>

公共属性是传递原始值,简单对象和数组的绝佳解决方案。

另外,可以 在获取或设置属性时使用getter和setter来执行一些逻辑。并记住,用@api装饰器注释它们,以使其对其他组件公开。

同样,您可以创建可从父组件调用的公共方法。通过使用@api装饰器定义子组件,在子组件中创建一个公共方法,然后从父组件中调用它。

假设我们有一个像这样的子组件。

// videoPlayer.js
import { LightningElement, api } from 'lwc';
export default class VideoPlayer extends LightningElement {
   @api
   play() {
       // Play music!
   }
}

当c-video-player组件包含在父组件中时,我们可以像这样从父组件调用方法:

// methodCaller.js
import { LightningElement } from 'lwc';
export default class MethodCaller extends LightningElement {
   handlePlay() {
      this.template.querySelector('c-video-player').play();
   }
}

我们定义了一种handlePlay()触发事件的方法。然后,我们使用querySelector()DOM方法搜索名为c-video-player的DOM元素并调用其公共方法。

用HTML处理事件

因此,我们的选择器应用程序需要处理一种类型的事件-用户单击磁贴。发生这种情况时,详细信息组件应使用相关图块中的信息重新呈现。您可以处理HTML中的事件(在模板中添加事件侦听器)或JavaScript(编写事件侦听器函数)。我们建议使用HTML方法,如下所示。

每个图块组件都侦听用户单击,因为图块组件的HTML(tile.html)包含onclick事件侦听器。

<template>
    <div class="container">
        <a onclick={tileClick}>
            <div class="title">{product.fields.Name.value}</div>
            <img class="product-img" src={product.fields.Picture_URL__c.value}></img>
        </a>
    </div>
</template>

当用户单击UI中的一个tile实例时,onclick侦听器将调用tileClicktile.js JavaScript文件中的处理程序函数。

import { LightningElement, api } from 'lwc';
export default class Tile extends LightningElement {
    @api product;
    tileClick() {
        const event = new CustomEvent('tileclick', {
            // detail contains only primitives
            detail: this.product.fields.Id.value
        });
        // Fire the event from c-tile
        this.dispatchEvent(event);
    }
}

选择器应用程序事件模式

在产品选择器应用程序中,我们使用一个复杂的组件(一个组件包含多个父组件和子组件),建议您通过组件层次结构向上传播事件,以便父组件可以响应子事件。如果您还有其他子组件(而不是引发事件的子组件),则可以将属性传递给这些子组件以响应事件。

该模式如下所示:

事件流通过组件层次结构。

为此,我们需要将事件侦听器和处理程序按层次结构链接到ebikes组件。然后将一个属性传递到详细信息组件。

在我们的示例文件中,您将看到以下内容。

  1. tile.html具有onclick事件侦听器,该事件侦听器调用tileClick处理程序。
  2. tile.js具有tileClick创建包含细节值(this.product.fields.Id.value)的新CustomEvent对象的方法。
  3. List.html具有ontileClick调用handleTileClick处理程序的侦听器。
  4. List.js具有handleTileClick创建另一个evt也包含详细信息值的事件对象()的方法。并使用JavaScript调度事件:
    // Fire the event from c-list
    this.dispatchEvent(event);
  5. 选择器.html具有onproductselected调用handleProductSelected处理程序的事件侦听器。
  6. selector.js将handleProductSelected方法设置selectedProductId为该evt.detail值。
  7. detail.html具有等待产品值的条件指令(还记得单元2中的指令)吗:
    <template if:true={product}>
  8. detail.js将各个部分组合在一起。它创建一个私有variable _productId来跟踪productId值的状态。然后,它使用获取/设置模式获取值并将其设置为私有变量产品,该产品可以让detail.html加载条件内容。

Getter和Setter是常见的JavaScript结构。它们使您可以向属性分配添加逻辑和条件。

import { LightningElement, api } from 'lwc';
import { bikes } from 'c/data';
export default class Detail extends LightningElement {
    product;
    // Private var to track @api productId
    _productId = undefined;
    // Use set and get to process the value every time it's
    // requested while switching between products
    set productId(value) {
        this._productId = value;
        this.product = bikes.find(bike => bike.fields.Id.value === value);
    }
    // getter for productId
    @api get productId(){
        return this._productId;
    }
}

每次单击磁贴时,此过程都会重复进行。

注意

事件具有管理事件在DOM树上传播的属性。您可以在配置事件传播中了解有关它们的更多信息 。更改默认值是为了进行高级事件处理,并且需要进行测试以确保预期的行为。

将文件部署到组织

让我们将这些文件部署到启用了Dev Hub的组织中,以了解其工作原理。使用在上一个单元中执行的相同步骤,部署新文件,打开组织,并使用此应用程序在Lightning App Builder中创建页面。

  1. 要部署项目文件,请右键单击默认文件夹,然后选择SFDX:从VS Code中的命令面板中将源部署到组织
  2. 要打开您的组织,请使用SFDX:在VS Code中从命令面板打开默认组织
  3. 在设置中,在快速查找框中输入Lightning App Builder,然后选择Lightning App Builder
  4. 点击新建
  5. 使用选择器组件创建一个区域页面。

您将拥有一个完全交互式的页面,其中包含多个相互配合的组件。接下来,我们尝试样式化并从组织获取实时数据。

闪电Web组件基础 – 部署Lightning Web组件文件

学习目标

完成本单元后,您将能够:

  • 配置Lightning Web组件文件以在组织中显示。
  • 将文件部署到组织。
  • 验证组织环境中的组件行为。

加强组织

现在是时候离开游乐场了,尽管您会发现它是一个非常有用的地方。在本单元中,我们使用带有Salesforce扩展的VS Code开发Lightning Web组件。我们将文件部署到组织中,并构建一个应用程序来使用您的组件。

你需要什么

如第一单元所述,您需要对Salesforce DX有一定的了解才能继续。要完成本单元,您需要:

  • 带Salesforce扩展包的Visual Studio代码
  • Salesforce CLI
  • 已启用开发中心的组织
  • 将My Domain部署到启用了Dev Hub的组织中的用户(在Trailhead中创建的Playground组织已为您部署了My Domain。如果将Developer Edition组织与您的Trailhead帐户相关联,请启用并部署My Domain。)

要满足其余这些要求,请完成“ 快速入门:闪电Web组件”项目。如果尚未配置,请启用Dev Hub并从组织中的“设置”菜单部署“我的域”。

设置要在组织中使用的Lightning Web组件文件

您将以上一个单元为例,将其命名为bikeCard组件并将其推送到您的组织。

注意

我们没有定义自己的样式,因此不需要CSS文件。

将组件推送到组织所需的文件:

bikeCard.html

<template>
    <div>
        <div>Name: {name}</div>
        <div>Description: {description}</div>
        <lightning-badge label={material}></lightning-badge>
        <lightning-badge label={category}></lightning-badge>
        <div>Price: {price}</div>
        <div><img src={pictureUrl}/></div>
    </div>
</template>

bikeCard.js

import { LightningElement } from 'lwc';
export default class BikeCard extends LightningElement {
   name = 'Electra X4';
   description = 'A sweet bike built for comfort.';
   category = 'Mountain';
   material = 'Steel';
   price = '$2,700';
   pictureUrl = 'https://s3-us-west-1.amazonaws.com/sfdc-demo/ebikes/electrax4.jpg';
 }

bikeCard.js-meta.xml

<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <!-- The apiVersion may need to be increased for the current release -->
    <apiVersion>48.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__AppPage</target>
        <target>lightning__RecordPage</target>
        <target>lightning__HomePage</target>
    </targets>
</LightningComponentBundle>
  1. 通过选择SFDX创建项目:在VS Code中从命令面板创建项目。接受标准模板,并为其指定项目名称bikeCard
  2. 右键单击lwc文件夹,然后选择SFDX:Create Lightning Web Component,创建一个bikeCard组件文件夹和文件。创建bikeCard组件文件。
  3. 将内容保存在bikeCard \ force-app \ main \ default \ lwc下的文件中,以便在VS Code中看到以下内容:bikeCard组件文件结构。 Lightning Web组件遵循Web标准。HTML标准建议自定义元素名称包含连字符。但是,Salesforce平台不允许在组件文件夹或文件名中使用连字符。因此,我们在这里使用camelCase命名约定。
  4. 从上方复制bikeCard.html,bikeCard.js和bikeCard.js-meta.xml文件的内容
  5. 保存文件。

组件配置文件

我们尚未介绍的文件是扩展名为的组件配置文件.js-meta.xml。该文件提供了Salesforce的元数据,包括打算在Lightning App Builder中使用的组件的设计配置。

组成组件的文件,包括配置文件。

我们尚未涵盖配置文件,因为我们一直在操场上玩。现在,您将开始使用组织中的内容,您必须包括一个配置文件。

请注意,ebikes repo组件均具有此配置文件。这是ebikes回购中的 一个示例:

<?xml version="1.0" encoding="UTF-8" ?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>48.0</apiVersion>
    <isExposed>true</isExposed>
    <masterLabel>Product Card</masterLabel>
    <targets>
        <target>lightning__AppPage</target>
        <target>lightning__RecordPage</target>
        <target>lightning__HomePage</target>
        <target>lightningCommunity__Page</target>
    </targets>
    <targetConfigs>
        <targetConfig targets="lightning__RecordPage">
            <objects>
                <object>Product__c</object>
            </objects>
        </targetConfig>
    </targetConfigs>
</LightningComponentBundle>

必需的 apiVersion将组件绑定到Salesforce API版本。

isExposedtruefalse)使组件可从其他命名空间使用。仅将其设置为true才能使Lightning组件在以下特定情况下可用:

  • 从Aura中的托管软件包
  • 从另一个组织中的Lightning App Builder

可选 目标指定可以在Lightning App Builder中将组件添加到哪种Lightning页面类型。

使用targetConfigs可以指定特定于每种Lightning页面的行为,包括诸如哪些对象支持该组件之类的事情。

请参阅 文档以获取受支持语法的完整列表。

在组织中显示组件

您有两个选项可用于在UI中显示Lightning Web组件。

  1. 设置组件以支持各种灵活页类型(主页,记录主页等),然后使用Lightning App Builder将其添加到灵活页。这是最简单的方法,也是您在本单元中遵循的方法。
  2. 您还可以创建一个选项卡,该选项卡指向包含Lightning Web组件的Aura组件。Lightning Web Components Recipes存储库使用此方法。您可以在回购中查看所需的件。
    • 包装组件
    • 可见性设置
    • 标签
    • 默认应用程序配置文件

部署文件

现在,您需要将组件文件部署到启用了Dev Hub的组织中。

  1. 使用SFDX向您的Dev Hub组织进行身份验证在VS Code中从命令面板授权组织。出现提示时,接受Project Default,然后按Enter接受默认别名。如果提示允许访问,请单击允许
  2. 使用SFDX部署项目文件从VS Code中的命令面板将此源部署到组织

为您的组件创建一个新页面

由于我们设置了组件配置文件以允许在Lightning App Builder中使用组件,因此请使用UI创建一个应用程序并将组件添加到其中。

  1. 要打开您的组织,请使用SFDX:在VS Code中从命令面板打开默认组织
  2. 在设置中,在快速查找框中输入Lightning App Builder,然后选择Lightning App Builder
  3. 点击新建
  4. 选择应用程序页面,然后单击下一步
  5. 给它加上标签Bike Card,然后单击Next
  6. 选择一个地区,然后单击完成
  7. 在Lightning App Builder中,向下滚动左侧的Lightning组件列表,直到看到您的bikeCard组件。Lightning App Builder自定义组件菜单中的bikeCard组件选项。

现在,您可以将其拖动到页面上。保存页面,将其激活,然后BikeCard组件将显示在分配的页面上。

  1. 将您的bikeCard组件拖到页面布局的顶部,直到看到自行车出现。
  2. 点击保存
  3. 点击激活
  4. 对所有用户保持激活状态。并且,可以选择更改应用程序的名称或图标。
  5. 点击保存。系统会要求您将页面添加到导航菜单,但不需要这样做。在这种环境下,您仍然可以进入页面。
  6. 点击完成
  7. 单击右上角的“后退”退出Lightning App Builder。
  8. 在应用启动器( 应用启动器。)中,找到并选择Bike Card
  9. 打开它,然后查看您的组件在UI中的运行情况。您在Lightning Experience中的Bike Card应用程序。

你去了,一辆闪亮的新自行车。您已经将组件推送到组织中,在页面上可以看到它,并且可以在UI中对其进行验证。

在下一个单元中,您将构建一个具有事件处理功能的交互式组件,并将其部署到组织中进行测试。

电Web组件基础 – 创建闪电Web组件

学习目标

完成本单元后,您将能够:

  • 描述每个组件文件的内容。
  • 为Lightning Web组件创建JavaScript方法。
  • 在组件JavaScript中使用生命周期挂钩。

一些严肃的游戏时间

假设您要独立于Salesforce中的特定对象构建数据显示元素。一个很好的例子是ebikes示例存储库中的 productCard组件。让我们检查一下该卡组件,并从头开始构建我们自己的版本,以便您可以看到它如何演变为成熟的Lightning Web组件。在Lightning Web Components Playground中构建组件的各个部分并探索更多示例时,您将快速获得基础知识。

组件只需要一个文件夹及其名称相同的文件。它们会按名称和位置自动链接。

文件夹中的组件文件

所有Lightning Web组件都有一个名称空间,该名称空间与文件夹名称之间用连字符分隔。例如,默认名称空间c中文件夹名称为app的Lightning Web组件的标记为<c-app>。您可以main.js在Lightning Web Components Playground中看到这一点。

但是,Salesforce平台不允许在组件文件夹或文件名中使用连字符。如果组件的名称包含多个单词(例如“ mycomponent”)怎么办?您无法命名文件夹和文件my-component,但是我们有一个便捷的解决方案。

使用驼峰式外壳命名您的组件myComponent。驼峰案例组件文件夹名称在标记中映射到kebab-case。在标记中,要引用文件夹名为myComponent的组件,请使用<c-my-component>

例如,LWC Samples存储库的 viewSource文件夹包含viewSource组件的文件。当hello组件 引用HTML中的viewSource组件时,将使用 c-view-source

浏览HTML文件

Lightning Web组件HTML文件均包含 template标记。该 template标签包含定义您的组件结构的HTML。让我们看一下ebikes回购中productCard组件的简化版本的HTML。

接下来,将这些示例粘贴到 Lightning Web Components Playground中。

  1. 单击新建开始一个新项目。
  2. 将以下内容粘贴到app.html中(替换文件中所有现有的HTML)。
<template>
    <div>
        <div>Name: {name}</div>
        <div>Description: {description}</div>
        <div>Category: {category}</div>
        <div>Material: {material}</div>
        <div>Price: {price}</div>
        <div><img src={pictureUrl}/></div>
    </div>
</template>

花括号{}中的标识符绑定到相应JavaScript类中同名的字段。

这是一个支持此HTML的JavaScript文件。将此粘贴到app.js

import { LightningElement } from 'lwc';
export default class App extends LightningElement {
   name = 'Electra X4';
   description = 'A sweet bike built for comfort.';
   category = 'Mountain';
   material = 'Steel';
   price = '$2,700';
   pictureUrl = 'https://s3-us-west-1.amazonaws.com/sfdc-demo/ebikes/electrax4.jpg';
}

预览现在显示带有一些细节的自行车。如果没有,请点击运行

现在,假设您要显示数据,但是您知道它可能需要一些时间才能加载。您不希望用户想知道怎么回事。您可以在模板中使用 if:false和 if:true条件指令来确定呈现哪些视觉元素。

在“显示”以下内容 div标签没有出现,直到值 ready是 true在HTML文件中。

<template>
    <div id="waiting" if:false={ready}>Loading</div>
    <div id="display" if:true={ready}>
        <div>Name: {name}</div>
        <div>Description: {description}</div>
        <div>Category: {category}</div>
        <div>Material: {material}</div>
        <div>Price: {price}</div>
        <div><img src={pictureUrl}/></div>
    </div>
</template>

这是一些JavaScript在操场上进行测试。这将保留我们的数据值并设置3秒计时器。3秒后,内容应出现。(当然,这仅用于测试目的。)

import { LightningElement } from 'lwc';
export default class App extends LightningElement {
   name = 'Electra X4';
   description = 'A sweet bike built for comfort.';
   category = 'Mountain';
   material = 'Steel';
   price = '$2,700';
   pictureUrl = 'https://s3-us-west-1.amazonaws.com/sfdc-demo/ebikes/electrax4.jpg';
   ready = false;
   connectedCallback() {
       setTimeout(() => {
           this.ready = true;
       }, 3000);
   }
}

单击运行以查看条件指令的运行。

基础闪电Web组件

现在,您不想从头开始构建所有组件。因此,让我们探索使用基本的Lightning Web组件。当然,还有很多组件,包括字段类型,显示控制器,导航项等等。所有这些都在“组件参考”中列出 。

让我们突出自行车的细节。为此,将上一个示例中的材质和类别的div标签替换为lightning-badge组件。这是HTML。

<template>
    <div id="waiting" if:false={ready}>Loading</div>
    <div id="display" if:true={ready}>
        <div>Name: {name}</div>
        <div>Description: {description}</div>
        <lightning-badge label={material}></lightning-badge>
        <lightning-badge label={category}></lightning-badge>
        <div>Price: {price}</div>
        <div><img src={pictureUrl}/></div>
    </div>
</template>

钢铁山峰这两个字作为徽章出现。就这么简单。

正在使用闪电徽章

好。让我们看一下JavaScript。

使用JavaScript

这是使事情发生的地方。到目前为止,您已经看到,JavaScript方法定义了如何处理输入,数据,事件,状态更改等,以使组件正常工作。

Lightning Web组件的JavaScript文件必须至少包含此代码,其中 MyComponent是您分配的组件类的名称。

import { LightningElement } from 'lwc';
export default class MyComponent extends LightningElement {
}

该 export语句定义了扩展 LightningElement该类的类。最佳做法是,类的名称通常与JavaScript类的文件名匹配,但这不是必需的。

LWC模块

Lightning Web Components使用模块(ECMAScript 6中引入了内置模块)来捆绑核心功能,并使组件文件中的JavaScript可以访问它。Lightning Web组件的核心模块是 lwc

从import语句开始模块,并指定组件使用的模块功能。

该 import语句指示JavaScript使用模块中的 LightningElement功能 lwc

// import module elements
import { LightningElement} from 'lwc';
// declare class to expose the component
export default class App extends LightningElement {
    ready = false;
    // use lifecycle hook
    connectedCallback() {
        setTimeout(() => {
            this.ready = true;
        }, 3000);
    }
}
  • LightningElement是Lightning Web组件的基类,它允许我们使用connectedCallback()
  • connectedCallback()方法是我们生命周期的钩子之一。在下一节中,您将了解有关生命周期挂钩的更多信息。现在,知道在将组件插入文档对象模型(DOM)中时触发该方法。在这种情况下,它将启动计时器。

生命周期挂钩

Lightning Web Components提供了一些方法,使您可以将代码“挂钩”到组件生命周期中的关键事件。这些事件包括组件何时为:

  • 已建立
  • 添加到DOM
  • 在浏览器中呈现
  • 遇到错误
  • 已从DOM中删除

使用回调方法响应任何这些生命周期事件。例如,将 connectedCallback()组件插入DOM时将调用。disconnectedCallback()当从DOM中删除组件时, 将调用。

在我们用来测试条件渲染的JavaScript文件中,connectedCallback()当组件插入DOM时,我们使用了该 方法自动执行代码。代码等待3秒钟,然后设置ready为 true

import { LightningElement } from 'lwc';
export default class App extends LightningElement {
    ready = false;
    connectedCallback() {
        setTimeout(() => {
            this.ready = true;
        }, 3000);
    }
}

注意

在VS Code之类的编辑器中使用此示例时,可能会看到该setTimeout()函数的警告消息“ Restricted async operation ….” 。此警告表明您使用的异步操作经常被滥用;它根据时间延迟行为,而不是等待事件。在这种情况下, setTimeout()适合演示任意时间延迟,并且警告不应阻止您使用它。

另外,请注意,我们使用了 this关键字。如果您已经编写了JavaScript,那么关键字的用法应该很熟悉,并且其行为就像在其他环境中一样。thisJavaScript中的 关键字指的是当前上下文的顶层。在这里,上下文是此类。该 connectedCallback()方法为顶级就绪变量分配值。这是一个很好的例子,说明了Lightning Web Components如何将JavaScript功能引入您的开发。您可以this在参考资料小节中找到有关良好信息的链接 。

我们发展很快,您已经可以尝试一些方法。在下一个单元中,我们将退后一步,进一步讨论组件所处的环境。

装饰工

装饰器通常在JavaScript中用于修改属性或函数的行为。

要使用装饰器,请从lwc模块导入装饰器, 并将其放置在属性或函数之前。

import { LightningElement, api } from 'lwc';
export default class MyComponent extends LightningElement{
    @api message;
}

您可以导入多个装饰器,但是一个属性或函数只能有一个装饰器。例如,属性不能具有 @api和 @wire装饰器。

Lightning Web Components装饰器的示例包括:

  • @api:将字段标记为公共。公共属性定义组件的API。在其HTML标记中使用该组件的所有者组件可以访问该组件的公共属性。所有公共属性都是反应性的,这意味着框架会观察该属性以进行更改。当属性值更改时,框架会做出反应并重新渲染组件。
    提示字段和属性几乎是可以互换的术语。组件作者在JavaScript类中声明字段。该类的实例具有属性。对于组件使用者,字段是属性。在Lightning Web组件中,只有组件作者@api用来装饰的字段才可以作为对象属性公开给消费者。
  • @track:告诉框架观察对象属性或数组元素的更改。如果发生更改,框架将重新渲染该组件。所有字段都是反应性的。如果字段的值发生更改,并且该字段在模板中使用(或在模板中使用的属性的获取器中使用),则框架将重新渲染该组件。您无需使用修饰字段@track。使用@track如果一个字段包含一个对象或数组只,如果你想的框架来观察更改对象的属性或数组的元素。如果要更改整个属性的值,则无需使用@track
    在20年春季之前,您必须使用@track将字段(也称为私有属性)标记为反应性。您不再需要这样做。使用@track只告诉框架来观察变化为对象的属性,或为数组的元素。一些旧的示例可能仍会@track在不需要的地方使用,但这没关系,因为使用装饰器不会更改功能或破坏代码。有关更多信息,请参见此 发行说明。
  • @wire:为您提供一种从Salesforce组织获取和绑定数据的简便方法。

这是一个使用@api装饰器从另一个组件(应用程序)中的一个组件(自行车)渲染值的示例 。在组件游乐场中,文件如下所示:示例应用程序文件结构。

该应用程序组件使用以下HTML。

<!-- app.html -->
<template>
<div>
    <c-bike bike={bike}></c-bike>
</div>
</template>

该应用程序组件使用以下JavaScript。

// app.js
import { LightningElement } from 'lwc';
export default class App extends LightningElement {
    bike = {
        name: 'Electra X4',
        picture: 'https://s3-us-west-1.amazonaws.com/sfdc-demo/ebikes/electrax4.jpg'
    };
}

自行车组件使用以下HTML。

<!-- bike.html -->
<template>
    <img src={bike.picture} alt="bike picture" />
    <p>{bike.name}</p>
</template>

自行车组件使用以下JavaScript。

// bike.js
import { LightningElement, api } from 'lwc';
export default class Bike extends LightningElement {
    @api bike;
}

在带有和不带有@api装饰器的组件游乐场中尝试一下, 以查看行为。

奖金!在操场上尝试这些组件

既然您已经熟悉了组件操场,那么花点时间尝试一下Lightning Web Components Recipes中的一些示例 。尝试将其中的示例中的一些HTML,JavaScript和CSS粘贴到组件游乐场中,这是熟悉核心组件概念的一种好方法。

闪电Web组件基础 – 发现闪电Web组件

学习目标

完成本单元后,您将能够:

  • 解释Lightning Web Components编程模型。
  • 列出使用Lightning Web组件的好处。
  • 查找开始开发Lightning Web组件所需的条件。

Web标准编程的门户

现在是时候将您的Salesforce知识和对HTML,JavaScript和CSS等标准技术的熟悉程度结合在一起,以构建下一代Salesforce应用程序。使用这些通用标准为您的Salesforce组织构建组件,同时保持与现有Aura组件的兼容性。

Lightning Web Components专注于开发人员和用户体验。因为我们为现有技术打开了大门,所以您可以利用在Salesforce之外开发的技能来构建Lightning Web组件。您可以使用所有这些功能,而不必放弃使用Aura组件已经完成的工作。

注意

您是否注意到最后一段中的大写字母不同?如果是这样,您有敏锐的眼睛。当我们引用Lightning Web Components编程模型时,所有单词都大写。仅当我们将组件本身称为Lightning Web组件时,才大写第一个单词。

另外,您一直在使用的Lightning Components编程模型现在称为Aura Components。这些组件本身称为Aura组件。

在您进一步之前

您应该对Salesforce DX项目和Salesforce CLI有基本的了解。您还需要在Trailhead帐户中使用正确配置的组织,并在Salesforce Extension Pack中使用VS Code。您可以通过完成快速入门:闪电Web组件了解所有这些 信息。

如果您使用的是附加到Trailhead帐户的Developer Edition组织,则需要在安装程序中部署“我的域”(Trailhead Playground组织会自动部署“我的域”)。

为什么要使用闪电Web组件?

现代浏览器基于Web标准,并且不断发展的标准正在不断改进浏览器可以呈现给用户的内容。我们希望您能够利用这些创新。

Lightning Web Components使用核心 Web Components标准,仅提供在Salesforce支持的浏览器中良好运行所必需的内容。因为它基于在浏览器中本地运行的代码构建,所以Lightning Web Components是轻量级的,并具有出色的性能。您编写的大多数代码都是标准的JavaScript和HTML。

您会发现更容易:

  • 在网上常见的地方找到解决方案。
  • 寻找具有必要技能和经验的开发人员。
  • 利用其他开发人员的经验(甚至在其他平台上)。
  • 发展更快。
  • 利用完整的封装,使组件更加通用。

而且这并不像Web组件是新的。实际上,浏览器多年来一直在创造这些东西。实例包括 <select>, <video>, <input>,和作为比容器更任何标签。这些元素实际上等效于Web组件。我们的目标是将这种集成水平带入Salesforce开发。

简单组件创建

遵守Web标准的好处是简单。您无需增加特定框架的怪癖。您只需使用HTML,JavaScript和CSS创建组件。闪电Web组件的创建是一个,两个,三个步骤。我不是在开玩笑。真的就是这么简单。您创建(1)JavaScript文件,(2)HTML文件,以及可选的(3)CSS文件。

  • HTML提供了组件的结构。
  • JavaScript定义了核心业务逻辑和事件处理。
  • CSS为您的组件提供外观,感觉和动画。

这些是您组件的基本组成部分。

这是一个非常简单的Lightning Web组件,它在输入字段中显示“ Hello World”。

的HTML

<template>
    <input value={message}></input>
</template>

template标签是一个组件的HTML的基本构建块。它允许您存储HTML片段。

的JavaScript

import { LightningElement } from 'lwc';
export default class App extends LightningElement {
  message = 'Hello World';
}

稍后我们还将介绍import语句和类声明的详细信息。

的CSS

input {
   color: blue;
}

至少,您真正需要的只是在同一文件夹中具有相同名称(也具有匹配名称)的HTML文件和JavaScript文件。您将它们部署到带有一些元数据的组织中,一切顺利。Salesforce会编译您的文件并自动为您处理样板组件的构造。

闪电Web组件游乐场

让我们去游乐场。我们已经创建了一个空间,您可以在其中试用组件,进行修改,并查看即时结果。

  1. 转到 https://developer.salesforce.com/docs/component-library/tools/playground第一次到达那里时,您会看到一个可以探索的示例。它包括Lightning Design System CSS框架中的样式。这些样式提供了与Lightning Experience一致的外观。它还包含一些标准的Lightning Web组件,例如lightning-combobox。
  2. 现在,我们只想测试基础知识。在操场上,单击“新建”
  3. 将上述HTML,JavaScript和CSS示例复制到操场上相应的应用程序文件中。
  4. 点击运行。恭喜你!您已经创建了一个组件。

如果返回到 初始的Playground页面,您将再次看到默认示例,并且可以开始一个新项目。

闪电Web组件和Aura组件可以协同工作

想知道是否可以保留现有的Aura组件?是的你可以!您可以使用Lightning Web组件,而无需放弃现有组件。您最终可能会将现有组件迁移到Lightning Web Component模型,但是我们将引入Lightning Web组件,而不会脱离Aura组件的现有支持。Aura组件和Lightning Web组件可以很好地协作。

实际上,Aura组件可以包含Lightning Web组件(尽管反之亦然)。但是,纯Lightning Web组件实现提供了完全的封装,并不断发展对通用标准的遵守。

可以使用的很酷的东西

要有效地开发Lightning Web组件,请使用以下工具和环境。

Dev Hub和Scratch Orgs Scratch组织是一次性的Salesforce组织,以支持开发和测试。开发中心是一项功能,可管理您的临时组织。两者都是Salesforce DX工具集的一部分。Salesforce DX是由Salesforce构建和支持的一组集成开发工具。 Salesforce命令行界面(CLI) Salesforce CLI提供了一种快速的方法来运行用于创建和配置临时组织以及部署组件的操作。这也是Salesforce DX工具集的一部分。 Lightning组件库有关Aura和Lightning Web组件以及如何使用它们的参考,参见 https://developer.salesforce.com/docs/component-library/overview/components。

您也可以通过组织的实例查看该库,网址为http:// <instance> .lightning.force.com / docs / component-library。通过查看实例中的库,您只会看到组织的正确版本。而且,当您创建自己的自定义组件时,它们也会出现在库中。

GitHub我们通过GitHub存储库共享扩展,示例等。获取一个GitHub帐户,以确保您可以利用这些产品。 Visual Studio代码Salesforce扩展包我们将Visual Studio视为开发工具,为您提供用于构建组件的集成环境。适用于Visual Studio Code的Salesforce扩展包提供了代码提示,棉绒警告和内置命令:https : //marketplace.visualstudio.com/items?itemName= salesforce.salesforcedx-vscode 。 Lightning Web组件食谱我们提供了一个GitHub存储库,以帮助您了解Lightning Web组件的工作方式。您可以克隆,修补并将这些样本混合发布到您自己的临时组织中,并查看它们的实际效果。拿到 https://github.com/trailheadapps/lwc-recipes。 电动自行车演示此GitHub存储库是查看Lightning Web组件如何工作的另一种好方法。电动自行车演示是Lightning Web组件的端到端实现,以创建应用程序。在您自己的临时组织中尝试此示例。在https://github.com/trailheadapps/ebikes-lwc上获取它 。 Lightning Data Service(LDS)通过Lightning Data Service从Salesforce访问数据和元 数据。与数据配合使用的基础Lightning组件基于LDS构建。自定义您自己的组件,以利用LDS缓存,变更跟踪,性能等优势。 防雷柜通过具有Lightning Locker的安全性,可以保护属于一个名称空间的Lightning Web组件免受其他名称空间中的组件的影响 。通过仅允许访问受支持的API并消除对未发布框架内部的访问,Lightning Locker还倡导了最佳实践,这些最佳实践提高了代码的可支持性。

展望未来

欢迎来到Lightning Web组件的世界

在您准备将文件部署到临时组织之前,我们将继续使用Lightning Web Components Playground作为另一个单元。在操场上,我们将看到您可以使用HTML和JavaScript文件做什么。

闪电Web组件基础 – 发现闪电Web组件

学习目标

完成本单元后,您将能够:

  • 解释Lightning Web Components编程模型。
  • 列出使用Lightning Web组件的好处。
  • 查找开始开发Lightning Web组件所需的条件。

Web标准编程的门户

现在是时候将您的Salesforce知识和对HTML,JavaScript和CSS等标准技术的熟悉程度结合在一起,以构建下一代Salesforce应用程序。使用这些通用标准为您的Salesforce组织构建组件,同时保持与现有Aura组件的兼容性。

Lightning Web Components专注于开发人员和用户体验。因为我们为现有技术打开了大门,所以您可以利用在Salesforce之外开发的技能来构建Lightning Web组件。您可以使用所有这些功能,而不必放弃使用Aura组件已经完成的工作。

注意

您是否注意到最后一段中的大写字母不同?如果是这样,您有敏锐的眼睛。当我们引用Lightning Web Components编程模型时,所有单词都大写。仅当我们将组件本身称为Lightning Web组件时,才大写第一个单词。

另外,您一直在使用的Lightning Components编程模型现在称为Aura Components。这些组件本身称为Aura组件。

在您进一步之前

您应该对Salesforce DX项目和Salesforce CLI有基本的了解。您还需要在Trailhead帐户中使用正确配置的组织,并在Salesforce Extension Pack中使用VS Code。您可以通过完成快速入门:闪电Web组件了解所有这些 信息。

如果您使用的是附加到Trailhead帐户的Developer Edition组织,则需要在安装程序中部署“我的域”(Trailhead Playground组织会自动部署“我的域”)。

为什么要使用闪电Web组件?

现代浏览器基于Web标准,并且不断发展的标准正在不断改进浏览器可以呈现给用户的内容。我们希望您能够利用这些创新。

Lightning Web Components使用核心 Web Components标准,仅提供在Salesforce支持的浏览器中良好运行所必需的内容。因为它基于在浏览器中本地运行的代码构建,所以Lightning Web Components是轻量级的,并具有出色的性能。您编写的大多数代码都是标准的JavaScript和HTML。

您会发现更容易:

  • 在网上常见的地方找到解决方案。
  • 寻找具有必要技能和经验的开发人员。
  • 利用其他开发人员的经验(甚至在其他平台上)。
  • 发展更快。
  • 利用完整的封装,使组件更加通用。

而且这并不像Web组件是新的。实际上,浏览器多年来一直在创造这些东西。实例包括 <select>, <video>, <input>,和作为比容器更任何标签。这些元素实际上等效于Web组件。我们的目标是将这种集成水平带入Salesforce开发。

简单组件创建

遵守Web标准的好处是简单。您无需增加特定框架的怪癖。您只需使用HTML,JavaScript和CSS创建组件。闪电Web组件的创建是一个,两个,三个步骤。我不是在开玩笑。真的就是这么简单。您创建(1)JavaScript文件,(2)HTML文件,以及可选的(3)CSS文件。

  • HTML提供了组件的结构。
  • JavaScript定义了核心业务逻辑和事件处理。
  • CSS为您的组件提供外观,感觉和动画。

这些是您组件的基本组成部分。

这是一个非常简单的Lightning Web组件,它在输入字段中显示“ Hello World”。

的HTML

<template>
    <input value={message}></input>
</template>

template标签是一个组件的HTML的基本构建块。它允许您存储HTML片段。

的JavaScript

import { LightningElement } from 'lwc';
export default class App extends LightningElement {
  message = 'Hello World';
}

稍后我们还将介绍import语句和类声明的详细信息。

的CSS

input {
   color: blue;
}

至少,您真正需要的只是在同一文件夹中具有相同名称(也具有匹配名称)的HTML文件和JavaScript文件。您将它们部署到带有一些元数据的组织中,一切顺利。Salesforce会编译您的文件并自动为您处理样板组件的构造。

闪电Web组件游乐场

让我们去游乐场。我们已经创建了一个空间,您可以在其中试用组件,进行修改,并查看即时结果。

  1. 转到 https://developer.salesforce.com/docs/component-library/tools/playground第一次到达那里时,您会看到一个可以探索的示例。它包括Lightning Design System CSS框架中的样式。这些样式提供了与Lightning Experience一致的外观。它还包含一些标准的Lightning Web组件,例如lightning-combobox。
  2. 现在,我们只想测试基础知识。在操场上,单击“新建”
  3. 将上述HTML,JavaScript和CSS示例复制到操场上相应的应用程序文件中。
  4. 点击运行。恭喜你!您已经创建了一个组件。

如果返回到 初始的Playground页面,您将再次看到默认示例,并且可以开始一个新项目。

闪电Web组件和Aura组件可以协同工作

想知道是否可以保留现有的Aura组件?是的你可以!您可以使用Lightning Web组件,而无需放弃现有组件。您最终可能会将现有组件迁移到Lightning Web Component模型,但是我们将引入Lightning Web组件,而不会脱离Aura组件的现有支持。Aura组件和Lightning Web组件可以很好地协作。

实际上,Aura组件可以包含Lightning Web组件(尽管反之亦然)。但是,纯Lightning Web组件实现提供了完全的封装,并不断发展对通用标准的遵守。

可以使用的很酷的东西

要有效地开发Lightning Web组件,请使用以下工具和环境。

Dev Hub和Scratch Orgs Scratch组织是一次性的Salesforce组织,以支持开发和测试。开发中心是一项功能,可管理您的临时组织。两者都是Salesforce DX工具集的一部分。Salesforce DX是由Salesforce构建和支持的一组集成开发工具。 Salesforce命令行界面(CLI) Salesforce CLI提供了一种快速的方法来运行用于创建和配置临时组织以及部署组件的操作。这也是Salesforce DX工具集的一部分。 Lightning组件库有关Aura和Lightning Web组件以及如何使用它们的参考,参见 https://developer.salesforce.com/docs/component-library/overview/components。

您也可以通过组织的实例查看该库,网址为http:// <instance> .lightning.force.com / docs / component-library。通过查看实例中的库,您只会看到组织的正确版本。而且,当您创建自己的自定义组件时,它们也会出现在库中。

GitHub我们通过GitHub存储库共享扩展,示例等。获取一个GitHub帐户,以确保您可以利用这些产品。 Visual Studio代码Salesforce扩展包我们将Visual Studio视为开发工具,为您提供用于构建组件的集成环境。适用于Visual Studio Code的Salesforce扩展包提供了代码提示,棉绒警告和内置命令:https : //marketplace.visualstudio.com/items?itemName= salesforce.salesforcedx-vscode 。 Lightning Web组件食谱我们提供了一个GitHub存储库,以帮助您了解Lightning Web组件的工作方式。您可以克隆,修补并将这些样本混合发布到您自己的临时组织中,并查看它们的实际效果。拿到 https://github.com/trailheadapps/lwc-recipes。 电动自行车演示此GitHub存储库是查看Lightning Web组件如何工作的另一种好方法。电动自行车演示是Lightning Web组件的端到端实现,以创建应用程序。在您自己的临时组织中尝试此示例。在https://github.com/trailheadapps/ebikes-lwc上获取它 。 Lightning Data Service(LDS)通过Lightning Data Service从Salesforce访问数据和元 数据。与数据配合使用的基础Lightning组件基于LDS构建。自定义您自己的组件,以利用LDS缓存,变更跟踪,性能等优势。 防雷柜通过具有Lightning Locker的安全性,可以保护属于一个名称空间的Lightning Web组件免受其他名称空间中的组件的影响 。通过仅允许访问受支持的API并消除对未发布框架内部的访问,Lightning Locker还倡导了最佳实践,这些最佳实践提高了代码的可支持性。

展望未来

欢迎来到Lightning Web组件的世界

在您准备将文件部署到临时组织之前,我们将继续使用Lightning Web Components Playground作为另一个单元。在操场上,我们将看到您可以使用HTML和JavaScript文件做什么。

设置您的Lightning Web Components开发人员工具 – 分析您的代码并将其部署到您的组织

分析您的代码并将其部署到您的组织

您已经安装了我们推荐的用于开发Lightning Web Components的工具。然后您复制并粘贴了一些损坏的代码,我们知道这将导致部署失败。您可能会说您以前从未在现实生活中做到过,对吧?

您知道您可以向专家学习吗? 观看此视频,以了解有关该项目主题的更多信息:

修复JavaScript错误

在网络上搜索(希望能正常工作的)代码后,作为开发人员最重要的任务是自己编写有效的代码。让我们修复前面介绍的错误,从JavaScript文件开始。

  1. 打开Visual Studio代码
  2. 单击myFirstWebComponent.js
  3. 将鼠标悬停在带有红色下划线的单词上track。这将显示与此特定错误相关的错误消息:
    将鼠标悬停在窗口上,并显示错误消息:“需要进行装饰器转换”和“未定义'轨道'。”
  4. 单击“问题”选项卡以显示当前打开的文件中出现的所有错误。您应该会看到以下内容:
    Visual Studio Code中的“问题”选项卡,显示多个错误

当前文件以及“问题”选项卡都显示代码中检测到的错误。

第一条错误消息表明这是Lightning Web Components引擎要求的结果。此类错误包括“ LWC”后跟数字。如果仔细看一下代码,您会在第一行中看到我们正在LightningElement 从lwc引擎导入,但是我们没有在导入track。让我们修复一下:

  1. 在单词后面LightningElement(在花括号内)单击鼠标右键。
  2. 输入track,不要忘了用逗号分隔两个单词。您的代码应如下所示:
    import { LightningElement, track } from 'lwc';
  3. 在macOS上按CMD + S,在Windows或Linux上按CTRL + S来保存文件。

错误和红线都消失了。

注意

默认情况下,IDE会在您键入内容时验证文件的内容。您可以在Visual Studio Code中将其设置为首选项,以在键入时或在保存文件后进行验证。

但是等等,为什么两个错误都消失了?又为什么其他错误消息以[eslint]开头

默认情况下,ESLint附带Lightning Web Components扩展。ESLint是一种广泛使用的整理工具,可评估代码是否有错误,编码最佳实践等。作为Lightning Web组件开发人员,Salesforce为您提供了开箱即用的特定ESLint规则,以便您可以编写出色的代码。而且,如果您犯了一个错误,则在部署代码之前,插入规则可以帮助您查看错误。那不是很好吗?

显示以上错误信息[no-undef]。该错误消息表示您定义了一个属性,在本例中为decorator track,但之前未进行声明。这是 许多超级有用的整理规则之一,可帮助您保持代码的清洁和可维护。

您还记得.eslintrc自动添加到lwc元数据文件夹的文件吗?这是配置文件,用于定义特定于Salesforce的整理规则:

{
   "extends": "plugin:@salesforce/eslint-config-lwc/recommended"
}

Salesforce提供了不同的规则集,包括基本推荐扩展。由于这些棉绒规则是特定于项目的,因此您可以将不同的规则集用于不同的项目。

注意

部署Lightning Web组件时,Salesforce会根据插入@salesforce/eslint-config-lwc/base规则自动验证您的代码。如果您自己重新配置掉毛规则,请记住这一点。

如果您想了解有关ESLint或Salesforce提供的插入规则的更多信息,请查看 GitHub存储库

现在我们有了一个有效的JavaScript文件,让我们在您的Web组件模板中修复HTML标记。

修复HTML模板错误

现在,您已经修复了JavaScript文件中的错误,您将学习如何与Salesforce Lightning Web Components扩展一起使用Visual Studio Code的智能功能。

  1. 在Visual Studio代码中打开myFirstWebComponent.html
  2. 将光标置于带红色下划线的for:each属性的空花括号中。
  3. CTRL +空格键。您会看到智能感知下拉列表。
    具有智能感知窗口的HTML标记
  4. 按Enter键。
  5. 接下来,将此属性添加到带有红色标记的div标记中:
    key={contact.Id}
  6. 在macOS上按CMD + S,在Windows或Linux上按CTRL + S来保存文件。

您的代码应如下所示:

<lightning-card title="ContactInformation" icon-name="custom:custom14">
   <div class="slds-m-around_medium">
      <template for:each={contacts} for:item="contact">
         <div key={contact.Id}>
            {contact.Name}, {contact.Title}
         </div>
      </template>
   </div>
</lightning-card>

在修改代码时,您看到了两件事。

首先,对HTML标记内的表达式进行智能感知。Lightning Web Components扩展提供了智能感知功能,这意味着如果您将其他属性或功能添加到JavaScript文件中,则模板文件中将自动为您提供它们。节省大量时间!

其次,您经历了代码的动态验证,或者在这种情况下是标记。与JavaScript文件中的相同。例如,如果您缺少必填属性,IDE会告诉您。

您还将在模板文件中的所有基本Lightning组件上获得智能感知。当您开始输入时<lightning,您将得到一个这样的列表。

基本Lightning组件智能感知窗口,显示基本Lightning组件的列表。

而且,当您将光标悬停在现有标记上时,该扩展会为您提供有关所选基本组件的丰富信息。

基础闪电组件文档

部署和配置新的Lightning Web组件

现在,我们所有的代码都已修复,现在是将本地元数据推送到草稿组织的时候了。

  1. 打开Visual Studio代码
  2. 在macOS上按Command + Shift + P或在Windows或Linux上按Ctrl + Shift + P,然后键入focus terminal。按Enter键
  3. 输入以下命令以将元数据部署到您的组织中:
    sfdx force:source:push
  4. Enter键

将元数据成功推送到草稿组织后,您可以将组件添加到“客户记录”布局中。

注意

您还可以使用force:source:deploy命令针对非临时组织开发Lightning Web组件。在Salesforce CRM定制和扩展模块的Salesforce环境和Salesforce DX单元中 更快地了解有关源驱动开发的更多信息 。

正如我们已经在Visual Studio Code中一样,我们可以利用Salesforce CLI的另一个功能。

  1. 转到Visual Studio代码终端。
  2. 输入以下命令,然后按Enter。这将打开默认的临时组织。
    sfdx force:org:open

现在,让我们配置Accounts对象的布局。

  1. 在应用启动器(应用启动器图标)中,找到并选择销售
  2. 单击“帐户”选项卡,然后单击“新建”以创建一个帐户。输入Component Developers作为Account Name,然后点击Save
  3. 单击齿轮图标( 安装装置),然后选择“编辑页面”以打开Lightning App Builder。
  4. myFirstWebComponent组件拖到页面上。
  5. 单击保存,然后单击激活
  6. 单击“指定为组织默认值”,然后单击“保存”
  7. 单击上一步以返回到帐户记录。

而已!该项目向您展示了如何安装和使用推荐的开发人员工具来开发Lightning Web Components。而且您学习了如何复制和粘贴有错误的代码(以后应避免使用)。

设置您的Lightning Web Components开发人员工具 – 创建一个闪电Web组件

创建一个闪电Web组件

在这一步中,您将学习如何使用之前安装的工具。

您知道您可以向专家学习吗? 观看此视频,以了解有关该项目主题的更多信息:

创建一个Salesforce DX项目

使用Salesforce CLI与组织进行交互的基本基础是Salesforce DX项目。一个项目由几个本地配置文件以及要部署的代码组成。用Salesforce术语来说,我们将此代码称为元数据,它是Salesforce平台的基础。如果您不熟悉Salesforce,请查看“ 平台开发基础知识”以了解有关我们元数据驱动方法的更多信息。

我们将使用Visual Studio Code创建一个项目。

  1. 打开Visual Studio代码
  2. 在macOS上按Command + Shift + P或在Windows或Linux上按Ctrl + Shift + P,然后键入create project。选择SFDX:创建项目,然后按Enter
  3. 保留默认的项目类型选择Standard,然后按Enter
  4. 输入Trailhead作为项目名称,然后按Enter
  5. 在您的本地计算机上选择将要存储项目的目录。单击创建项目

大!您已经创建了第一个用于使用Lightning Web Components的Salesforce DX项目。Visual Studio Code将自动为您打开新项目。

授权您的开发中心

下一步是对开发中心进行身份验证。如果您使用的是Trailhead Playground,则可以在“ 获取Trailhead Playground用户名和密码”中了解如何获取下一步的凭据。

  1. Visual Studio Code中,在macOS上按Command + Shift + P,在Windows或Linux上按Ctrl + Shift +P
  2. 键入sfdx
  3. 选择SFDX:授权开发中心
  4. 使用您的Dev Hub组织凭据登录。
  5. 点击允许
    Dev Hub认证屏幕
  6. 在浏览器中进行身份验证之后,CLI会记住您的Dev Hub凭据。成功消息应如下所示:   授权开发人员中心的成功消息

验证Dev Hub是创建临时组织的先决条件,这是在Salesforce平台上进行开发的临时环境。我们在下一步中创建一个。

创建一个临时组织
  1. 在Visual Studio Code中,在macOS上按Command + Shift + P,在Windows或Linux上按Ctrl + Shift +P
  2. 键入sfdx
  3. 选择SFDX:创建一个默认暂存组织…
  4. Enter接受默认值project-scratch-def.json
  5. Enter接受默认的trailhead临时组织别名。
  6. Enter接受默认的7 days临时组织工期。
  7. 请耐心等待,创建临时组织可能需要一分钟。在VS Code的输出面板中,成功消息应如下所示:
17:18:11.779 sfdx force:org:create -f config\project-scratch-def.json --setalias trailhead --durationdays 7 --setdefaultusername --json --loglevel fatal ended with exit code 0

现在,您已经准备好开发第一个Lightning Web组件。如果您想了解有关Salesforce DX的更多信息,请查看使用Salesforce DX进行 应用程序开发。

创建一个闪电Web组件

创建Lightning Web组件是一个简单的过程。而且Salesforce CLI已经创建了一个项目结构,可以帮助您更轻松地上手。

文件夹结构如下所示:

Visual Studio Code中Salesforce DX项目的文件浏览器视图,显示了包括.sfdx,.vscode,config和force-app的子目录。

我们创建的项目有一个特殊的文件夹force-app/main/default。此文件夹称为包目录,包含当前Salesforce DX项目的所有元数据。由于Lightning Web组件也是元数据,因此它们存储在名为的子文件夹中lwc。在下一步中,我们将Lightning Web组件添加到此文件夹。

注意

文件lwc夹中还有两个文件,.eslintrc和jsconfig.json 。我们将在本项目的后面探讨它们。

我们可以像创建Salesforce DX项目一样使用Visual Studio Code创建Lightning Web组件。或者,我们可以直接使用Salesforce CLI。

  1. 打开Visual Studio代码
  2. 在macOS上按Command + Shift + P或在Windows或Linux上按Ctrl + Shift + P,然后键入focus terminal。Enter键
  3. 输入sfdx force:lightning:component:create -n myFirstWebComponent -d force-app/main/default/lwc --type lwc,然后按Enter确认。

这将为您的第一个Lightning Web组件创建所需的文件。

具有扩展的Lightning Web组件文件夹的元数据目录结构

这些是您在命令中使用的参数。

  • -n-定义Lightning Web组件文件夹及其文件的名称。
  • -d-这定义了应在其中创建Lightning Web组件的目标目录。目标目录必须命名lwc
  • –type-这指定您要创建Lightning Web组件。

注意

如您所料,在开发过程中很容易使用Salesforce CLI。如果要为此使用Visual Studio Code,请右键单击该lwc文件夹或在Visual Studio Code中打开“命令面板”。两者都提供了SFDX选项:Create Lightning Web Component,然后调用Salesforce CLI。

将代码和元数据添加到第一个Lightning Web组件

现在让我们看一下构成Lightning Web组件的文件。为此,我们将复制并粘贴我们已经为您准备的一些HTML,JavaScript和XML。我们从myFirstWebComponent.js-meta.xml文件开始。

  1. 打开新的子文件夹myFirstWebComponent,我们只是在LWC子文件夹中创建
  2. 单击myFirstWebComponent.js-meta.xml
  3. 用以下XML标记替换XML文件的内容:
    <?xml version="1.0" encoding="UTF-8"?>
    <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
       <apiVersion>45.0</apiVersion>
       <isExposed>true</isExposed>
       <targets>
           <target>lightning__AppPage</target>
           <target>lightning__RecordPage</target>
           <target>lightning__HomePage</target>
       </targets>
    </LightningComponentBundle>
  4. 在macOS上按CMD + S,在Windows或Linux上按CTRL + S来保存文件。

您刚刚更新的文件是元数据定义文件。它包含几个配置元素,这些元素控制例如使用Lightning App Builder(目标)将其添加到Salesforce用户界面的位置。您可以在文档中阅读有关元数据配置选项的更多信息 。

接下来,我们将更新Lightning Web组件的JavaScript文件。

注意

您将要复制和粘贴的JavaScript代码和HTML标记内置了一些错误。因此,不必担心看到的红色波浪线。在本项目的后面,您将结合使用Visual Studio Code和Salesforce Lightning Web组件扩展功能来解决错误。

  1. 在Visual Studio代码中,单击myFirstWebComponent.js
  2. 用以下代码替换文件的内容:
    import { LightningElement } from 'lwc';
    export default class HelloIteration extends LightningElement {
        @track
        contacts = [
            {
                Id: 1,
                Name: 'Amy Taylor',
                Title: 'VP of Engineering',
            },
            {
                Id: 2,
                Name: 'Michael Jones',
                Title: 'VP of Sales',
            },
            {
                Id: 3,
                Name: 'Jennifer Wu',
                Title: 'CEO',
            },
        ];
    }
  3. 在macOS上按CMD + S,在Windows或Linux上按CTRL + S 来保存文件。

保存文件后,您会立即注意到一些事情。

  • 带注释的单词@track在红色波浪线下划线。
  • 资源管理器中的JavaScript文件颜色变为红色,并且旁边有2。

打开JavaScript文件,突出显示错误

两者都表明JavaScript代码中的某些内容不正确。作为一名优秀的开发人员,您通常会立即对其进行修复。但是现在您可以忽略这些问题。而是将HTML标记添加到Web组件模板文件。

  1. 在Visual Studio代码中,单击myFirstWebComponent.html
  2. 将此标记插入现有<template></template>标签中:
    <lightning-card title="ContactInformation" icon-name="custom:custom14">
       <div class="slds-m-around_medium">
          <template for:each={} for:item="contact">
             <div>
                {contact.Name}, {contact.Title}
             </div>
          </template>
       </div>
    </lightning-card>
  3. 在macOS上按CMD + S,在Windows或Linux上按CTRL + S来保存文件。

同样,您会看到一个指示,表明HTML标记中的某些内容不是应该的。

HTML模板文件打开,并在第4行突出显示错误

让我们也忽略它(暂时)。

通常,下一步是将项目部署到组织中。但是代码中充满了错误,并且部署将失败。在现实生活中,您可能会或可能不会遇到失败的部署。请务必注意IDE中显示的所有错误,并立即进行修复。