在闪电Web组件之间通信 – 在不相关的组件之间通信

在不相关的组件之间通信

要在DOM中的子树之间通信(以及在某些情况下,登录到同一组织的不同浏览器窗口之间的通信),请使用闪电消息服务(LMS)。LMS是一项发布和订阅服务,可促进Lightning Web组件,Aura组件和Visualforce页面之间的通信。  

除非您同时控制两个组件和一个公共父组件,否则请使用LMS进行不相关组件之间的通信。LMS功能强大,有效且易于使用,但不要在不必要时诱使您使用它。触发DOM事件效率更高。当您需要与无法控制的父级(例如两个App Builder插槽)在组件之间进行通信时,Lightning消息服务是理想的选择。

LMS通信图显示了一个文档对象,该对象包含多个元素,包括父元素中的一个元素。 LMS通道由元素之间的单向和双向箭头表示。

第三个业务部门希望参与号码处理项目。他们需要“优先计数”和“计数”在自己的组件中在一起,以便可以在需要的地方显示它们。让我们从创建消息通道开始,以便为组件使用做好准备。

名为remoteControl的组件将信息发送到不相关的名为counts的组件。

创建闪电消息通道

  1. 在Visual Studio Code的默认文件夹中,创建一个名为的文件夹 messageChannels
  2. messageChannels文件夹中,创建一个名为的文件 Count_Updated.messageChannel-meta.xml
  3. Count_Updated.messageChannel-meta.xml中,粘贴以下代码:
    <?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>
  4. 保存并部署文件。

创建发布者组件

  1. 创建名为的Lightning Web组件remoteControl
  2. 用以下代码替换remoteControl.js的内容:
    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);
      }
    }

    我们进口publishMessageContext从闪电消息服务。我们还导入刚刚创建的频道(Count_Updated__c)。数据有效载荷与该publish功能一起发送。

  3. 保存文件。
  4. 打开remoteControl.html并在template 标签之间添加以下代码:
      <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>

    注意,我们正在重新使用控件组件。

  5. 保存文件。
  6. 更新remoteControl.js-meta.xml,以使remoteControl组件在Lightning应用程序页面上可用:
        <isExposed>true</isExposed>
        <targets>
            <target>lightning__AppPage</target>
        </targets>
  7. 保存文件。

创建订户组件

  1. 创建名为的Lightning Web组件counts
  2. 用以下代码替换counts.js的内容:
    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();
      }
    }

    @wire(MessageContext)确保unsubscribe在组件销毁生命周期内运行。

  3. 保存文件。
  4. 打开counts.html并在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>
  5. 保存文件。
  6. 更新counts.js-meta.xml,以使计数组件在Lightning应用程序页面中可用:
        <isExposed>true</isExposed>
        <targets>
            <target>lightning__AppPage</target>
        </targets>
  7. 保存文件。

将新组件添加到Event Comms App

  1. 部署lwc文件夹,然后刷新Event Comms应用程序页面。
  2. 打开事件通讯页面进行编辑。
  3. remoteControl组件拖到页面的右侧区域。
  4. counts组件拖到remoteControl组件下方的右侧区域。
  5. 单击“保存”,然后退出Lightning App Builder。

验证通讯

  1. 单击远程控制中的按钮以更改计数组件中的计数。

您也可以使用Lightning消息服务与Aura组件和Visualforce页面进行通信。这是使不同类型的组件保持同步的最干净的方法。 

现在,您已经掌握了有关如何在Lightning Web组件之间进行通信的知识。您研究了子对父,父子对以及不相关的组件方案。确保检查资源以了解有关与Lightning Web组件通信的更多信息。

在闪电Web组件之间通信 – 父母与孩子沟通

父母与孩子沟通

为了启用从父组件到子组件的通信,子组件公开一个属性或函数以使其公开。然后,父母可以更新孩子的公共财产或调用孩子的公共职能。

父母与孩子之间的通信图,显示了增幅器至分子。

此外,如果要添加一些功能,请在子组件上将public属性更新为getter和setter。

让我们从简单的公共属性更新开始。另一个业务部门找到了您构建的分子。他们想使用它并添加到它。他们的第一个要求是能够设置计数器的起始编号。我们不想进行任何会影响原始业务用例的更改,因此让我们将分子组件包装在另一个组件中,该组件将拥有新功能。 

更新公共财产

@api子组件中的装饰器公开一个属性,使其公开,以便父组件可以对其进行更新。

  1. 在子组件(分子)中公开一个公共属性:
    1. 在Visual Studio Code中,打开numerator.js并将@api 装饰器应用于counter属性:
        @api counter = 0;
    2. apilwc模块导入装饰器。
    3. 保存文件。
  2. 创建并编写一个名为的新父组件augmentor
    1. 创建名为的Lightning Web组件augmentor
    2. extraor.js中,将此代码粘贴到Augmentor类中:
        startCounter = 0;
        
        handleStartChange(event) {
          this.startCounter = parseInt(event.target.value);
        }
    3. 保存文件。
    4. 打开exporor.html,并在template标签之间添加以下代码 :
        <lightning-card title="Augmentor" icon-name="action:download">
          <lightning-layout>
            <lightning-layout-item flexibility="auto" padding="around-small">
              <lightning-input
                label="Set Starting Counter"
                type="number"
                min="0"
                max="1000000"
                value={startCounter}
                onchange={handleStartChange}>
              </lightning-input>
            </lightning-layout-item>
          </lightning-layout>
          <c-numerator
            class="slds-show slds-is-relative"
            counter={startCounter}>
          </c-numerator>
        </lightning-card>
    5. 保存文件。
    6. 更新exporor.js-meta.xml,以在Lightning应用程序页面上使增强器组件可用:
          <isExposed>true</isExposed>
          <targets>
            <target>lightning__AppPage</target>
          </targets>
    7. 保存文件。
  3. 将新组件(增强器)添加到Event Comms应用程序页面:
    1. 部署lwc文件夹,然后刷新Event Comms应用程序页面。
    2. 打开Event Comms应用页面进行编辑。
    3. 扩充器组件拖到页面的中央区域。
    4. 单击“保存”,然后退出Lightning App Builder。
  4. 验证通讯:
    1. 要查看Salesforce中的更改,请刷新Event Comms应用程序页面。
    2. 在设置起始计数器字段中输入数字。
      计数将更新为您输入的内容。
    3. 单击乘法按钮之一。
      请注意,计数器会更新,但“设置起始计数器”保持不变。
    4. 更改原始分子组件中的值。
      它继续按预期工作。

父组件(增强器)将信息(startCounter)发送到子组件(分子)中的计数器属性。

因为我们将“设置起始计数器”放在其自己的组件(增强器)中,所以没有将其添加到分子组件中,而是继续为原始业务案例提供服务。现在分子从子级(控件)和父级(增强器)接收输入。

调用公共功能

该业务的第二个请求是将总数增加一百万。他们不希望设置开始计数发生变化。这意味着我们不能只更新startCounter属性。我们也没有要添加的扩充器组件中的当前计数。我们将对孩子调用一个公共函数来为我们进行更新。

@api子组件中的装饰器公开一个函数,使其公开,以便父组件可以调用它。

  1. 在子组件(分子)中创建一个公共函数:
    1. 打开numerator.js并将此maximizeCounter函数添加到该函数之后handleMultiply
        @api
        maximizeCounter() {
          this.counter += 1000000;
        }
    2. 保存文件。
  2. 在父组件(增强器)中,添加一个按钮及其处理程序:
    1. 打开exporor.js,并在handleMaximizeCounter 函数后添加以下handleStartChange函数:
        handleMaximizeCounter() {
          this.template.querySelector('c-numerator').maximizeCounter();
        }

      该函数c-numerator在exporor.html中找到标签并调用公共maximizeCounter函数。

    2. 保存文件。
    3. 打开exporor.html,并将其添加lightning-button到Set Starting Counter之后lightning-input
              <lightning-button 
                class="slds-var-p-vertical_xx-small"
                label="Add 1m To Counter"
                onclick={handleMaximizeCounter}>
              </lightning-button>
    4. 保存文件。
  3. 验证通讯:
    1. 要查看Salesforce中的更改,请部署lwc文件夹,然后刷新Event Comms应用程序页面。
    2. 单击“添加1m到计数器”
      数量增加了一百万。

在父级(增强器)中,新按钮触发handleMaximizeCounter 处理程序,该处理程序调用子级组件(分子)并触发其公共 maximizeCounter功能。

与前面的描述相对应的图。

使用公共Getter和Setter

此练习与在此步骤开始时更新属性的方式非常相似。实际上,我们根本不会更改父组件。在子组件中,我们仅使用公共获取器和设置器来实现公共柜台属性。

使用Event Comms的两个业务部门都喜欢更新。现在他们希望随着计数的变化看到计数的先前值。每当更改计数器属性时,我们都需要一种方法来捕获当前计数。在设置新值之前,我们可以获取当前计数并保存它。让我们使用一个名为的新私有变量,_currentCount以便我们可以使用它。为了保存先前的计数以便我们可以显示它,我们将使用一个名为的变量 priorCount

对于其他功能,我们将该counter属性实现为getter和setter(getset,也称为访问器属性)。然后,每次设置计数器时,我们都会在设置新的计数器值之前将当前计数器值(_currentCount)存储在priorCount变量中。

  1. 向子组件(分子)添加一个先验计数:
    1. 打开numerator.html并将此段落添加到带有Count的段落之前:
            <p class="slds-text-align_center slds-var-m-vertical_medium">
              Prior Count: <lightning-formatted-number value={priorCount}></lightning-formatted-number>
            </p>
    2. 保存文件。
    3. 打开numerator.js并进行@api counter = 0;注释(添加//到该行的开头)。
    4. 在评论之后,添加以下代码:
        _currentCount = 0;
        priorCount = 0;
        
        @api
        get counter() {
          return this._currentCount;
        }
        set counter(value) {
          this.priorCount = this._currentCount;
          this._currentCount = value;
        }

      此代码counter使用getter(get)和setter(set)函数更改为属性。它还添加priorCount和 _currentCount属性。

    5. 保存文件。
  2. 验证通讯:
    1. 要查看Salesforce中的更改,请部署lwc文件夹,然后刷新Event Comms应用程序页面。
    2. 单击“添加”,“ X2 ”和“向计数器添加1m” 以更改计数器值。
      更新计数器时,Prior Counter保持同步。
    3. 单击Numerator和Augmentor组件中的按钮以查看原始功能不受影响。

我们更新了分子组件,以使用getter和setter来更新新 priorCount属性。父组件(增强器)仍将信息(startCounter)发送到子组件(分子)。但现在,分子使用getter和setter来get_currentCount财产,set 在_currentCountpriorCount属性。

与前面的描述相对应的图。

挑战自己(可选-我们将不检查此代码)
更新handleMaximizeCountermaximizeCounter接受一个参数,该参数指定要添加到计数中的数字。提示:回顾你在步骤1中所做的发送 data-factormultiply自定义事件。

概要

您已经解决了Lightning Web组件之间的子对父和父子对子通信。在下一步中,您将使用Lightning消息服务在没有父子关系的组件之间进行通信。

在闪电Web组件之间通信 – 从孩子到父母沟通

学习目标

在此项目中,您将:

  • 构建彼此通信的Lightning Web组件。
  • 从子组件与其父组件进行通信。
  • 从父组件与子组件进行通信。
  • 从组件通信到不相关的组件。

该项目是为具有一定的Lightning Web组件经验的Salesforce开发人员设计的。如果您还不熟悉Lightning Web组件,我们建议您 在继续进行此项目之前,先完成Build Lightning Web Components路径中的一些标志 。

组件如何通信

当多个Lightning Web组件组成一个应用程序时,我们通常希望这些组件共享信息。我们如何从一个组件传递到另一组件取决于组件是否相关以及如何关联。另一个组件内部的组件将创建父子关系。父母与孩子交流的方式与孩子与父母交流的方式不同。这些都与不相关的组件(独立的DOM子树中的组件)相互通信的方式不同。

通讯类型:子对父,父子对以及不相关的组件。

在这个项目中,您将在每个关系中的组件之间建立通信。 

在你开始之前

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

创建一个新的Trailhead游乐场

对于此项目,您需要创建一个新的Trailhead Playground。滚动到该页面的底部,单击游乐场名称,然后单击创建Trailhead游乐场。创建新的Trailhead游乐场通常需要3-4分钟。 

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

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

让我们开始吧。转到您的Trailhead游乐场。(如果尚未打开,请滚动至该页面的底部,然后单击启动。)如果您在组织中看到一个标签为Get Your Login Credentials的标签,太好了!跳至步骤1。否则,请从App Launcher(应用启动器)中找到并打开Playground Starter,然后按照以下步骤操作。

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

设置项目

  1. 在Visual Studio Code中,创建一个名为的Salesforce DX项目Event Comms
  2. 授权您的Trailhead游乐场。

与自定义事件进行交流

让我们从一个简单的场景开始。子组件调度一个自定义事件,该事件触发父组件中的更新。

一个名为controls的子组件包含在其父组件(分子组件)中并与其通信。

发送事件时,您可以选择发送一些数据,并允许事件在DOM中冒泡。让我们从一个简单的场景开始。子组件调度一个自定义事件,该事件触发父组件中的更新。

从控件组件传递到分子组件

  1. 创建一个名为三个区域的Lightning应用程序页面Event Comms
    1. 在您的组织(您的Trailhead游乐场)中,打开“设置”。
    2. 在“快速查找”框中,输入Lightning App Builder,然后选择Lightning App Builder
    3. 点击新建
    4. 选择“应用程序页面”后,单击“下一步”
    5. 对于标签,输入Event Comms,然后单击下一步
    6. 选择三个区域,然后单击完成
    7. 单击保存激活保存完成
    8. 单击背部 以退出Lightning App Builder。
  2. 创建名为的父Lightning Web组件numerator
    1. 在Visual Studio Code中的force-app / main / default下,右键单击 lwc文件夹,然后选择SFDX:Create Lightning Web Component
    2. 输入numerator新组件的名称。
    3. Enter,然后再次按Enter接受默认值force-app/main/default/lwc
  3. 编写分子组件文件的代码:
    1. numerator.js中,将此代码粘贴到Numerator类中:
        counter = 0;
        
        handleIncrement() {
          this.counter++;
        }
        handleDecrement() {
          this.counter--;
        }
    2. 保存文件。
    3. 打开numerator.html,并在template标签之间添加以下代码 :
        <lightning-card title="Numerator" icon-name="action:manage_perm_sets">    
          <p class="slds-text-align_center slds-var-m-vertical_medium">
            Count: <lightning-formatted-number value={counter}></lightning-formatted-number>
          </p>
          <!-- controls go here -->
        </lightning-card>
    4. 保存文件。
    5. 要使分子组件在Lightning应用程序页面中可用,请打开 numerator.js-meta.xmlisExposed 用以下行替换标记:
          <isExposed>true</isExposed>
          <targets>
            <target>lightning__AppPage</target>
          </targets>
    6. 保存文件。
  4. 将分子组件添加到Event Comms应用程序:
    1. 右键单击lwc文件夹,然后选择 SFDX:将源部署到组织将lwc文件夹部署到您的组织。
    2. 应用启动器在您操场上的App Launcher()中,找到并打开Event Comms
    3. 单击 设定 并选择编辑页面以打开Event Comms应用程序页面进行编辑。
    4. 分子组件(在“组件”列表中的“自定义”下)拖到页面的左侧区域。
    5. 点击保存
    6. 单击背部 以退出Lightning App Builder。
  5. 创建并编写名为的子组件controls
    1. 返回Visual Studio Code并创建一个名为的Lightning Web组件 controls
    2. controls.js中,将此代码粘贴到Controls类中:
        handleAdd() {
          this.dispatchEvent(new CustomEvent('add'));
        }
        handleSubtract() {
          this.dispatchEvent(new CustomEvent('subtract'));
        }
    3. 保存文件。
    4. 打开controls.html,并在template标签之间添加以下代码 :
        <lightning-card title="Controls" icon-name="action:upload">
          <lightning-layout>
            <lightning-layout-item flexibility="auto" padding="around-small">
              <lightning-button
                label="Subtract"
                icon-name="utility:dash"
                onclick={handleSubtract}>
              </lightning-button>
            </lightning-layout-item>
            <lightning-layout-item flexibility="auto" padding="around-small">
              <!-- buttons go here -->
            </lightning-layout-item>
            <lightning-layout-item flexibility="auto" padding="around-small">
              <lightning-button
                label="Add"
                icon-name="utility:add"
                onclick={handleAdd}
                icon-position="right">
              </lightning-button>
            </lightning-layout-item>
          </lightning-layout>
        </lightning-card>
    5. 保存文件。
  6. 将子组件(控件)添加到父组件(分子):
    1. 打开numerator.htmlcontrols go here用以下代码替换 注释:
          <c-controls
            class="slds-show slds-is-relative"
            onadd={handleIncrement}
            onsubtract={handleDecrement}>
          </c-controls>
    2. 保存文件。
  7. 验证通讯:
    1. 要查看Salesforce中的更改,请部署lwc文件夹,然后刷新Trailhead Playground组织中的Event Comms应用程序页面。
    2. 单击添加,然后查看计数增加。
    3. 单击以查看计数减少。

现在,我们有了一个子组件(控件),add该组件将事件发送到父组件(分子),从而触发父组件(分子)中的handleIncrement函数。

与前面的描述相对应的图。

使用自定义事件发送数据

接下来,让孩子将带有事件的一些数据传递给父母。该企业希望增加数量。我们将为他们提供多种选择。使用自定义事件将数据从子级传递到父级。

  1. 向子组件(控件)添加乘法按钮和乘法功能:
    1. 打开controls.html,并使用以下代码替换buttons go here 第二个lightning-layout-item标签内的注释:
            <lightning-button
              label="2"
              data-factor="2"
              icon-name="utility:close"
              onclick={handleMultiply}>
            </lightning-button>
            <lightning-button
              label="3"
              data-factor="3"
              icon-name="utility:close"
              onclick={handleMultiply}>
            </lightning-button>
    2. 保存文件。
    3. 打开controls.js,并在handleMultiply 函数后添加以下handleSubtract函数:
        handleMultiply(event) {
          const factor = event.target.dataset.factor;
          this.dispatchEvent(new CustomEvent('multiply', {
            detail: factor
          }));
        }

      注意,我们将onclick事件传递给handleMultiply函数,函数data-factor通过 来获取按钮event.target.dataset.factor。然后,将factor以及新的自定义事件(multiply)传递给父组件(分子)。

    4. 保存文件。
  2. 更新父组件(分子):
    1. 打开numerator.html并将此属性添加到 c-controls标记中:
      onmultiply={handleMultiply}
    2. 保存文件。
    3. 打开numerator.js并将此handleMultiply 函数添加到该函数之后handleDecrement
        handleMultiply(event) {
          const factor = event.detail;
          this.counter *= factor;
        }

      此处,handleMultiply函数获取onmultiply 传入的事件,并使用其数据(event.detail)更新计数(计数器)。

    4. 保存文件。
  3. 验证通讯:
    1. 要查看Salesforce中的更改,请部署lwc文件夹,然后刷新Event Comms应用程序。
    2. 单击添加,然后查看计数增加。
    3. 单击X 2以查看计数乘以2。
    4. 单击X 3以查看计数乘以3。

控件组件将数据(data-factor)以及multiply自定义事件传递到其父级(分子)。

与前面的描述相对应的图。

允许自定义事件冒泡

两个乘法按钮成功了。现在,企业需要更多的乘法选择。让我们轻松添加所需数量的按钮。我们将为按钮添加另一个Lightning Web组件。为了使通信顺利进行,您将使用事件冒泡。冒泡允许来自按钮组件的自定义事件冒泡DOM树。

  1. 创建一个名为的组件button
    1. 创建名为的Lightning Web组件button
    2. button.js中,将此代码粘贴到Button类中:
        @api label;
        @api icon;
        
        handleButton(event) {
          this.dispatchEvent(new CustomEvent('buttonclick',{
            // bubbles: true
          }));
        }
    3. apilwc模块导入装饰器。
      import { LightningElement, api } from 'lwc';
    4. 保存文件。
    5. 打开button.html并在template标签之间添加以下代码 :
        <lightning-button
          label={label}
          data-factor={label}
          icon-name={icon}
          onclick={handleButton}>
        </lightning-button>
    6. 保存文件。
  2. 使按钮组件成为控件组件的子组件:
    1. 打开controls.html并删除 lightning-layout-item包含两个 lightning-button标签的。
    2. 替换为以下代码:
          <lightning-layout-item flexibility="auto" padding="around-small" onbuttonclick={handleMultiply}>
            <template for:each={factors} for:item="factor">
              <c-button
                key={factor}
                label={factor}
                data-factor={factor}
                icon="utility:close">
              </c-button>
            </template>
          </lightning-layout-item>

      请注意,我们已将handleMultiply函数调用移至中的 onbuttonclick处理程序lightning-layout-item。这样可以避免在每个按钮上添加处理程序,从而使代码更干净,更快。

    3. 保存文件。
    4. 打开controls.js并将此factors属性添加到 Controls类中:
        factors = [0,2,3,4,5,6];
    5. 保存文件。
  3. 验证通讯:
    1. 要查看Salesforce中的更改,请部署lwc文件夹,然后刷新Event Comms应用程序页面。
    2. 单击添加,然后查看计数增加。 
    3. 单击X 2,请注意没有任何反应。为什么?默认情况下,自定义事件不会在派发该事件的组件上冒泡。
      自定义事件未通过其容器。
      为使事件(buttonclick)上升到 lightning-layout-item,我们bubbles: true在中 添加CustomEvent
    4. 打开button.js并取消注释(删除//之前的内容) bubbles: true
      现在,自定义事件冒起了它的容器。
    5. 保存文件并再次部署。
    6. 刷新事件通讯应用程序页面。
    7. 现在单击添加将计数设置为1。
    8. 单击X 2以查看计数乘以2。
    9. 单击X 6以查看计数乘以6。
    10. 单击X 0将计数重置为零。
    11. 尝试以下单击:添加X 2X 5, X 2添加X 2。或者:添加, X 3X 2X 2, X 2X 2。或尝试您自己的组合。

挑战自己(可选-我们将不检查此代码)
在控件组件中添加按钮组件的第二个实例,以创建显示在分子组件中的除法按钮。