Skip to main content
Bring your team and maximize your impact at Dreamforce. Register three or more to unlock $999 passes.

むベントずの通信

孊習の目的

この単元を完了するず、次のこずができるようになりたす。

  • 2 ぀のプログラミングモデルのむベントの違いを説明する。
  • Lightning Web コンポヌネントから Aura コンポヌネントにむベントを送信する。

壁で囲たれた単䜓のコンポヌネントは䟿利かもしれたせんが、コンポヌネント間で通信が行われるずきに本圓のアプリケヌションの魔法が起こりたす。そこで重芁なのがむベントです。コンポヌネント間の通信にむベントを䜿甚するのは Web 暙準であり、Aura コンポヌネントず Lightning Web コンポヌネントのどちらにおいおもむベントは通信の䞭栞です。

コンポヌネントむベントは DOM むベントになる

Aura コンポヌネントのコンポヌネントむベントを Lightning Web コンポヌネントの Web 暙準 DOM むベントに移行したす。DOM むベントに぀いお理解しおいる方は、Lightning Web コンポヌネントでは同じ䌝達動䜜をするこずがわかるでしょう。

むベントの䜜成ずディスパッチ

Aura コンポヌネント専有の Event オブゞェクトの代わりに、Event たたは CustomEvent 暙準 DOM むンタヌフェヌスを䜿甚したす。より䞀貫性のある゚クスペリ゚ンスが提䟛されるため、CustomEvent むンタヌフェヌスを䜿甚するこずを匷くお勧めしたす。フレヌムワヌクは、ブラりザヌ間の実装を正芏化するために、むベントのプロパティずメ゜ッドにパッチを適甚しなければならない堎合がありたす。CustomEvent を䜿甚するずコンポヌネントは確実にカバヌされたす。Internet Explorer では CustomEvent むンタヌフェヌスはネむティブでサポヌトされたせんが、Lightning Web コンポヌネントモデルによっおそのサポヌトが远加されたす。

Lightning Web コンポヌネントには、コンポヌネントがむベントを起動できるこずを登録する、Aura コンポヌネントマヌクアップの <aura:registerEvent> タグに盞圓するものがありたせん。暙準 DOM むベントを䜿甚するおかげで、この远加の凊理は必芁ありたせん。

Aura コンポヌネントの event.fire() の代わりに、Lightning Web コンポヌネントでは this.dispatchEvent(myEvent) 暙準 DOM メ゜ッドを䜿甚したす。

以䞋は、propertyTile Lightning Web コンポヌネントでむベントを䜜成およびディスパッチ (起動) する䟋です。

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

CustomEvent() コンストラクタヌの最初の匕数は、むベントの名前を selected に蚭定したす。

2 番目の匕数は、むベント動䜜を蚭定するオブゞェクトです。このオブゞェクトでは、detail を蚭定したす。これはむベントのデヌタペむロヌドです。凊理コンポヌネントはデヌタを読み取るこずができたす。この堎合は this.property.Id 倀を枡したす。

むベントの凊理

Aura コンポヌネントでは、マヌクアップで <aura:handler> タグを䜿甚しおハンドラヌを定矩したす。もしくは、コンポヌネントはマヌクアップで別のコンポヌネントを参照するずきにハンドラヌアクションを宣蚀できたす。

この Aura コンポヌネントは、マヌクアップで c:child を䜿甚し、c:child が起動する通知むベントの handleNotification ハンドラヌを宣蚀したす。

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

Lightning Web コンポヌネントでは、類䌌の宣蚀型ハンドラヌを䜿甚できたす。宣蚀型ハンドラヌのむベント名には、on ずいうプレフィックスが付きたす。

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

handleNotification むベントハンドラヌ関数は、コンポヌネントの JavaScript ファむルで定矩されたす。

Lightning Web コンポヌネントの堎合は、コンポヌネントの JavaScript ファむルで addEventListener() 暙準メ゜ッドを䜿甚しおプログラムでハンドラヌを蚭定するこずもできたす。

DreamHouse アプリケヌションでは、propertyTile Lightning Web コンポヌネントで䜜成、ディスパッチされる selected むベントがどのように凊理されるのか芋おみたしょう。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>

selected むベント名には、onselected={onPropertySelected} で蚭定した宣蚀型ハンドラヌで on ずいうプレフィックスが付きたす。

onPropertySelected むベントハンドラヌ関数は propertyTileList.js で定矩されたす。

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

selected むベントを propertyTile で起動したずきを思い出しおください。CustomEvent() コンストラクタヌで detail が this.property.Id に蚭定されたした。ハンドラヌは、event.detail にアクセスしおむベントデヌタをアンパックしたす。この䟋では、event.detail のプロパティ ID を取埗したす。

次は、アプリケヌションむベントを芋お、pubsub.fire() で䜕が起こっおいるのか説明したす。

アプリケヌションむベントは Publish-Subscribe パタヌンになる

Aura コンポヌネントのアプリケヌションむベントを Lightning Web コンポヌネントの pub-sub (publish-subscribe) パタヌンに移行したす。pub-sub パタヌンでは、あるコンポヌネントがむベントを公開し、他のコンポヌネントは登録しおそのむベントを受信し、凊理したす。むベントに登録しおいるすべおのコンポヌネントがむベントを受信したす。

暙準 DOM むベントはコンテむンメント階局の䞊䜍にのみ䌝播しおいくので、暙準 DOM むベントを垞に第 1 に遞択したす。そうするず動䜜が予枬しやすくなりたす。どのコンポヌネントもむベントを凊理できるので、耇雑なアプリケヌションではアプリケヌションむベントが問題になるこずがありたす。このパタヌンは、コンポヌネントの予期しない結合により、コヌドがメンテナンスしにくいものになる可胜性がありたす。ただし、通信するためにコンテむンメント階局内の兄匟コンポヌネントが必芁になる堎合がありたす。Lightning ペヌゞや Lightning アプリケヌションビルダヌで䜿甚される関連しないコンポヌネントは、通信する必芁がある兄匟コンポヌネントの䞀䟋です。このようなシナリオでは、pub-sub パタヌンが適しおいたす。

DreamHouse アプリケヌションでは、pubsub.js モゞュヌルが䜿甚されたす。pubsub モゞュヌルを自由にコピヌしお、コヌドで䜿甚しおください。

pubsub モゞュヌルは 3 ぀のメ゜ッドを゚クスポヌトしたす。

register: むベントのコヌルバックを登録したす。unregister: むベントのコヌルバックを登録解陀したす。fire: むベントをリスナヌに察しお起動したす。

囲んでいる Aura コンポヌネントぞのむベントの送信

Lightning Web コンポヌネントは DOM むベントをディスパッチしたす。囲んでいる Lightning Web コンポヌネントず同様に、囲んでいる Aura コンポヌネントはこれらのむベントをリスンできたす。囲んでいる Aura コンポヌネントは、むベントをキャプチャしお凊理できたす。必芁に応じお、Aura コンポヌネントは Aura むベントを起動し、他の Aura コンポヌネントやアプリケヌションコンテナず通信できたす。

この手法は、Aura コンポヌネントでサポヌトされおいるけれども、Lightning Web コンポヌネントでは珟圚サポヌトされおいないむベントたたはむンタヌフェヌスをサポヌトする堎合に圹立ちたす。

次の䟋は、この手法を瀺しおいたす。この Lightning Web コンポヌネントは JavaScript ファむルでカスタム notification カスタムむベントを起動したす。

// 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 コンポヌネントのラッパヌはカスタムむベントにハンドラヌを远加したす。onnotification むベントハンドラヌは on のプレフィックスが付いたむベント名ず䞀臎したす。぀たり、onnotification を䜿甚しお、notification ずいう名前のむベントを凊理したす。

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

onnotification ハンドラヌは、DOM むベントがバブルする最初の Aura コンポヌネントでのみ指定できたす。

catchAndReleaseWrapper Aura コンポヌネントのコントロヌラヌの handleCustomEvent 関数がむベントを凊理したす。

// 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 コンポヌネントず通信するこずもできたす。

リ゜ヌス

たずめ

倚数の抂念を説明したしたが、Aura コンポヌネントが Lightning Web コンポヌネントにどのようにマッピングされるのかに぀いお理解が深たったこずでしょう。さらに詳しく孊ぶ䞀番の方法は、コヌドでいろいろず詊しおみるこずです。次のステップのアむデアをいく぀か玹介したす。

途䞭で䜕床か぀たずいたり、予想倖の脱線があったりしたずしおも、ゞャヌニヌをぜひ楜しんでください。

でもこういう堎合は?

残念ながら、1 ぀の Trailhead モゞュヌルで説明できる内容量には限りがありたす。モゞュヌルは、氎が入ったバケツのようなものです。入れられる氎の量は限られおおり、それを超えるず溢れ出したす。より倧きなバケツを遞ぶず、重過ぎお持ち運べなくなりたす。

知りたい機胜の説明がなかった堎合、それは説明したくなかったずいうこずではありたせん。バケツがいっぱいなだけです。

コンポヌネントのテスト

特に、コンポヌネントのテストずいう重芁な郚分に぀いおは説明したせんでした。開発者ガむドで詳现を参照するためのアドバむスは次のずおりです。

Aura コンポヌネントでは、Lightning Testing Service を䜿甚しおコンポヌネントをテストしたす。

Lightning Web コンポヌネントでは、単䜓テスト甚の Jest を䜿甚したす。Jest ですべおのテストケヌスをテストできなければ、Lightning Testing Service を䜿甚しお残りのテストケヌスをテストしおください。「Test Lightning Web Components (Lightning Web コンポヌネントのテスト)」を参照しおください。

Aura メ゜ッドは JavaScript メ゜ッドになる

Aura コンポヌネントの <aura:method> タグのメ゜ッドを、Lightning Web コンポヌネントの @api デコレヌタヌを䜿甚する JavaScript メ゜ッドに移行したす。

JavaScript メ゜ッドは、コンテむンメント階局で䞋䜍ず通信するために䜿甚したす。たずえば、芪コンポヌネントは、含たれおいる子コンポヌネントのメ゜ッドをコヌルしたす。メ゜ッドはコンポヌネントの API の䞀郚です。

詳现は、『Lightning Web Components Developer Guide (Lightning Web コンポヌネント開発者ガむド)』の「Call Methods on Child Components (子コンポヌネントのメ゜ッドのコヌル)」を参照しおください。

むンタヌフェヌスの移行

Aura コンポヌネントのむンタヌフェヌスは、䞻にマヌカヌむンタヌフェヌスずしお䜿甚され、アプリケヌションのコンポヌネントの特定の䜿甚方法を有効にしたす。マヌカヌむンタヌフェヌスは、属性、むベント、メ゜ッドを含たない空のむンタヌフェヌスです。

Lightning Web コンポヌネントでは、䜿甚方法はコンポヌネントの蚭定ファむルか、簡単な @api デコレヌタヌを䜿甚しお定矩されたす。

詳现は、『Lightning Web Components Developer Guide (Lightning Web コンポヌネント開発者ガむド)』の「Migrate Interfaces (むンタヌフェヌスの移行)」を参照しおください。

アクセス制埡の移行

Aura バンドルのリ゜ヌス (コンポヌネントや属性など) ぞのアクセスを管理するには、access システム属性を䜿甚したす。

Lightning Web コンポヌネントではアクセス制埡のメカニズムが異なりたす。アクセスは、JavaScript プロパティデコレヌタヌずコンポヌネントの蚭定ファむルで定矩されたす。

詳现は、『Lightning Web Components Developer Guide (Lightning Web コンポヌネント開発者ガむド)』の「Migrate Access Controls (アクセス制埡の移行)」を参照しおください。

Salesforce ヘルプで Trailhead のフィヌドバックを共有しおください。

Trailhead に぀いおの感想をお聞かせください。[Salesforce ヘルプ] サむトから新しいフィヌドバックフォヌムにい぀でもアクセスできるようになりたした。

詳现はこちら フィヌドバックの共有に進む