メッセージチャネルでの公開

Lightning Web コンポーネントからメッセージチャネルでメッセージを公開するには、範囲設定されたモジュール @salesforce/messageChannel をコンポーネントの JavaScript ファイルに含め、Lightning Message Service の publish() 関数をコールします。

Lightning Message Service は、コンポーネントライフサイクルの破棄フェーズになるまで、登録しているコンポーネントにメッセージを公開します。Lightning ページから移動すると、コンポーネントがキャッシュされ、破棄されないことがあります。Lightning Message Service がアプリケーション全体に範囲設定されている場合でも、これらのコンポーネントは Lightning Message Service からのメッセージを公開および受信します。

例: レコードが選択されたときに登録者に通知 

github.com/trailheadapps/lwc-recipes リポジトリの lmsPublisherWebComponent は、Lightning ページで登録者に通知するメッセージを公開します。Lightning Message Service により、ページの Visualforce、Aura、Lightning Web コンポーネントの間でそのメッセージの通信が行われます。

LWC、Aura、Visualforce のパブリッシャーコンポーネント

コンポーネントの HTML テンプレートファイルには、取引先責任者のリストが表示されます。取引先責任者が選択されると、handleContactSelect ハンドラが呼び出され、メッセージがメッセージチャネルに公開されます。

1<!-- lmsPublisherWebComponent.html -->
2<template>
3  <lightning-card title="LMSPublisherWebComponent" icon-name="custom:custom30">
4    <div class="slds-m-around_medium" oncontactselect={handleContactSelect}>
5      <template lwc:if={contacts.data}>
6        <template for:each={contacts.data} for:item="contact">
7          <c-contact-list-item-bubbling
8            key={contact.Id}
9            contact={contact}>
10          </c-contact-list-item-bubbling>
11        </template>
12      </template>
13    </div>
14  </lightning-card>
15</template>

コンポーネントの JavaScript ファイルで、メッセージチャネルと、メッセージチャネルを操作するために必要な Lightning Message Service 関数をインポートします。

1// lmsPublisherWebComponent.js
2import { LightningElement, wire } from "lwc";
3import getContactList from "@salesforce/apex/ContactController.getContactList";
4
5// Import message service features required for publishing and the message channel
6import { publish, MessageContext } from "lightning/messageService";
7import recordSelected from "@salesforce/messageChannel/Record_Selected__c";
8
9export default class LmsPublisherWebComponent extends LightningElement {
10  @wire(getContactList)
11  contacts;
12
13  @wire(MessageContext)
14  messageContext;
15
16  // Respond to UI event by publishing message
17  handleContactSelect(event) {
18    const payload = { recordId: event.target.contact.Id };
19
20    publish(this.messageContext, recordSelected, payload);
21  }
22}

@wire(MessageContext) を使用して MessageContext オブジェクトを作成します。このオブジェクトは、Lightning Message Service を使用している Lightning Web コンポーネントに関する情報を提供します。@wire(MessageContext) アダプタを使用する場合、コンポーネントのライフサイクルイベントを操作する必要はありません。コンポーネントが破壊されると、Lightning Message Service 機能によって自動的に登録が解除されます。

handleContactSelect() メソッドは、公開するメッセージコンテンツを作成します。Lightning Message Service の publish() 関数は、メッセージコンテキスト、メッセージチャネルの名前、メッセージペイロードの 3 つのパラメータを取ります。ここでは、メッセージペイロードは JSON オブジェクト (recordId キーの値は event.target.contact.Id) です。

コンポーネントを DOM に添付してからでないと、@wire(MessageContext) でデコレートされたプロパティを使用できません。constructor() 関数では @wire(MessageContext) を使用できません。

Note

関連トピック

The Japanese Summer '24 guide is now live

日本語の Summer '24 ガイドが公開されました! 「Component Reference (コンポーネントリファレンス)」は、以前と同様にコンポーネントライブラリにあります。