适用于Aura开发人员的Lightning Web Components

适用于Aura开发人员的Lightning Web Components 与Event通信

学习目标

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

  • 描述两种编程模型在事件上的差异。
  • 将事件从Lightning Web组件发送到Aura组件。

单独隔离的组件可能很有用,但是当组件开始相互交谈时,真正的应用程序魔术就会发生。这就是事件的源头。使用事件在组件之间进行通信是Web标准,而事件对于Aura组件和Lightning Web组件中的通信都是至关重要的。

组件事件成为DOM事件

将Aura组件中的组件事件迁移到Lightning Web组件中的Web标准DOM事件。如果您熟悉DOM事件,则会在Lightning Web组件中注意到相同的传播行为。

创建和发送事件

代替专有 事件 Aura组件中的对象,请使用 事件 要么 CustomEvent标准DOM接口。我们强烈建议您使用CustomEvent界面,因为这样可以提供更一致的体验。该框架可能需要修补事件的属性和方法,以规范浏览器之间的实现,并使用CustomEvent保证您的组件被覆盖。Internet Explorer不支持CustomEvent 接口本身,但Lightning Web组件模型增加了对此的支持。

Lightning Web组件中没有等效的 <aura:registerEvent>在Aura组件标记中标记,以注册组件可以触发事件。由于使用了标准的DOM事件,因此不需要额外的仪式。

代替 event.fire() 在Aura组件中,使用标准DOM方法, this.dispatchEvent(myEvent),在Lightning Web组件中。

这是在广告素材中创建和分配(触发)事件的示例 propertyTile 闪电网络组件。

export default class PropertyTile extends LightningElement {
    @api property;
    propertySelected() {
        const selectedEvent = new CustomEvent('selected', {
            detail: this.property.Id,
        });
        this.dispatchEvent(selectedEvent);
    }
}

中的第一个参数 CustomEvent() 构造函数将事件的名称设置为 已选

第二个参数是配置事件行为的对象。在此对象中,我们将详情,这是事件的数据有效负载。处理组件可以读取数据。在这种情况下,我们通过了this.property.Id 值。

处理事件

Aura组件使用 <光环:处理程序>在标记中标记以定义处理程序。另外,一个组件可以在其标记中引用另一个组件时声明一个处理程序动作。

此光环组件使用 c:孩子 在其标记中并声明一个 handleNotification 通知事件的处理程序 c:孩子 火灾。

<c:child notification="{!c.handleNotification}"/>

Lightning Web组件可以类似地具有声明性处理程序。声明处理程序中的事件名称以前缀

<c-child onnotification={handleNotification}></c-child>

的 handleNotification 事件处理函数在组件的JavaScript文件中定义。

在Lightning Web组件中,您还可以使用标准程序以编程方式设置处理程序 addEventListener() 组件的JavaScript文件中的方法。

让我们看看DreamHouse应用程序如何处理在 propertyTile闪电网络组件。的propertyTileList Lightning Web组件在其HTML文件中处理此事件。

<template for:each={properties} for:item="property">
    <c-property-tile property={property} key={property.Id} onselected={onPropertySelected}></c-property-tile>
</template>

的 已选 事件名称以开头  在由配置的声明处理程序中 onselected = {onPropertySelected}

的 onPropertySelected事件处理程序函数在propertyTileList.js中定义。

onPropertySelected(event) {
    pubsub.fire('propertySelected', event.detail);
}

让您回想起我们开除 已选 事件发生 propertyTile。的CustomEvent() 构造函数集 详情 至 this.property.Id。处理程序通过访问以下事件来解压缩事件数据事件细节。在此示例中,我们获得事件细节

我们解释发生了什么事 pubsub.fire() 接下来我们来看应用程序事件。

应用程序事件成为发布-订阅模式

将Aura组件中的应用程序事件迁移到Lightning Web组件中的发布-订阅(发布-订阅)模式。在发布-订阅模式中,一个组件发布一个事件,其他组件订阅以接收和处理该事件。订阅该事件的每个组件都会接收该事件。

标准DOM事件应该始终是您选择事件的首选,因为它们只会沿安全壳层次结构传播,从而使行为更加可预测。应用程序事件在复杂的应用程序中可能会出现问题,因为任何组件都可以处理该事件。由于组件的意外耦合,这种模式可能导致难以维护的代码。但是,有时您需要包含层次结构中的同级组件进行通信。Lightning页面或Lightning App Builder中使用的不相关组件是需要通信的同级组件的示例。在这些情况下,pub-sub模式是必经之路。

DreamHouse应用程序使用pubsub.js模块。随时复制pubsub 模块并在您的代码中使用它。

的 pubsub 模块导出三种方法。

寄存器
注册事件的回调。
取消注册
注销事件的回调。
向侦听器触发一个事件。

将事件发送到封闭的Aura组件

闪电Web组件调度DOM事件。封闭的Aura组件可以监听这些事件,就像封闭的Lightning Web组件一样。封闭的Aura组件可以捕获事件并进行处理。(可选)Aura组件可以触发Aura事件,以与其他Aura组件或与应用程序容器进行通信。

当您要支持Aura组件中使用但Lightning Web组件当前不支持的事件或接口时,此技术很有用。

以下示例说明了此技术。此Lightning Web组件触发自定义 通知 JavaScript文件中的事件。

// catchAndRelease.js
import { LightningElement } from 'lwc';
export default class CatchAndRelease extends LightningElement {
    /**
     * Handler for 'Fire My Toast' button.
     * @param {Event} evt click event.
     */
    handleFireMyToast(evt) {
        const eventName = 'notification';
        const event = new CustomEvent(eventName, {
            detail: { message: 'See you on the other side.' }
        });
        this.dispatchEvent(event);
    }
}

封闭的Aura组件包装器为自定义事件添加了处理程序。请注意,事件处理程序通知,将事件名称与 以它为前缀。即使用通知 处理名为 通知

<!-- catchAndReleaseWrapper.cmp -->
<aura:component implements="force:appHostable">
    <c:catchAndRelease onnotification="{!c.handleCustomEvent}"/>
</aura:component>

注意

注意

您只能指定一个 通知 DOM事件冒泡到的第一个Aura组件中的处理程序。

的 handleCustomEvent 在控制器的功能 catchAndReleaseWrapper Aura组件处理事件。

// catchAndReleaseWrapperController.js
({
    handleCustomEvent: function(cmp, evt) {
        // Get details from the DOM event fired by the Lightning web component
        var msg = evt.getParam('message') || '';
    }
})

Lightning Web组件调度的通知事件设置事件详细信息。

detail: { message: 'See you on the other side.' }

处理事件的Aura组件使用以下命令访问事件数据 evt.getParam(’message’)

您可以根据需要处理事件。您可以选择触发一个新的Aura事件,以与其他Aura组件进行通信。

你可能也会喜欢...