メッセージチャネルの登録および登録解除

メッセージチャネルでメッセージの登録および登録解除を行うには、メッセージチャネルを @salesforce/messageChannel で範囲設定されたモジュールから Lightning Web コンポーネントにインポートします。Lightning Message Service の subscribe() 関数と unsubscribe() 関数をコールします。

例: 公開されたメッセージの処理 

github.com/trailheadapps/lwc-recipes リポジトリの lmsSubscriberWebComponent では、メッセージチャネルへの登録、およびチャネルからの登録解除の方法が示されます。この例では、「メッセージチャネルでの公開」のパブリッシャーコンポーネントを使用します。

パブリッシャーコンポーネントから取引先責任者を選択すると、選択したレコード ID が Record_Selected__c メッセージチャネルに公開されます。

登録者コンポーネントの HTML は、公開されたメッセージに反応し、メッセージペイロードを介してレコード ID が提供された取引先責任者のデータを表示します。

1<!-- lmsSubscriberWebComponent.html -->
2<template>
3  <lightning-card title="LMSSubscriberWebComponent" icon-name="custom:custom30">
4    <div class="slds-m-around_medium">
5      <template lwc:if={Picture__c}>
6        <img src={Picture__c} alt="Profile photo" />
7      </template>
8      <p>{Name}</p>
9      <p>{Title}</p>
10      <p>
11        <lightning-formatted-phone value={Phone}></lightning-formatted-phone>
12      </p>
13      <p>
14        <lightning-formatted-email value={Email}></lightning-formatted-email>
15      </p>
16    </div>
17  </lightning-card>
18</template>

コンポーネントの JavaScript で、lightning/messageService から登録に必要な Message Service の機能をインポートします。@salesforce/messageChannel から Record_Selected__c メッセージチャネルをインポートします。

@wire(MessageContext) を使用してコンテキストオブジェクトを作成します。このオブジェクトは、Lightning Message Service を使用している Lightning Web コンポーネントに関する情報を提供します。コンポーネントを DOM に添付してからでないと、@wire(MessageContext) でデコレートされたプロパティを使用できません。

subscribeToMessageChannel() 関数は、subscription が null かどうかを確認します。subscription が null の場合、Lightning Message Service の subscribe() メソッドをコールして subscription に割り当てます。subscribe() メソッドは、メッセージコンテキスト、メッセージチャネルの名前、公開されたメッセージを処理するリスナーメソッドの 3 つの必須パラメータを取ります。リスナーメソッドが呼び出されると、メッセージを handleMessage() に渡します。handleMessage() は、受信した JSON メッセージペイロードから recordId プロパティを抽出します。次に、レコード ID と一致する取引先責任者の関連情報で HTML テンプレートが更新されます。

メッセージチャネル上のメッセージをアプリケーション内の任意の場所から受信するには、subscribe() メソッドの 4 番目のパラメータ (省略可能) として { scope: APPLICATION_SCOPE } を渡します。「Message Service の範囲の定義」を参照してください。

Lightning Message Service からのメッセージの受信を停止するには、登録参照を渡して unsubscribe() をコールします。subscription オブジェクトには、解除する登録への参照が含まれます。次の例では、unsubscribeToMessageChannel() をコールします。これにより、unsubscribe() がコールされて、subscription が null に設定されます。

1// lmsSubscriberWebComponent.js
2import { LightningElement, wire } from "lwc";
3import { getRecord, getFieldValue } from "lightning/uiRecordApi";
4import { ShowToastEvent } from "lightning/platformShowToastEvent";
5import { reduceErrors } from "c/ldsUtils";
6
7// Import message service features required for subscribing and the message channel
8import {
9  subscribe,
10  unsubscribe,
11  APPLICATION_SCOPE,
12  MessageContext,
13} from "lightning/messageService";
14import recordSelected from "@salesforce/messageChannel/Record_Selected__c";
15
16import NAME_FIELD from "@salesforce/schema/Contact.Name";
17import TITLE_FIELD from "@salesforce/schema/Contact.Title";
18import PHONE_FIELD from "@salesforce/schema/Contact.Phone";
19import EMAIL_FIELD from "@salesforce/schema/Contact.Email";
20import PICTURE_FIELD from "@salesforce/schema/Contact.Picture__c";
21
22const fields = [NAME_FIELD, TITLE_FIELD, PHONE_FIELD, EMAIL_FIELD, PICTURE_FIELD];
23
24export default class LmsSubscriberWebComponent extends LightningElement {
25  subscription = null;
26  recordId;
27
28  Name;
29  Title;
30  Phone;
31  Email;
32  Picture__c;
33
34  @wire(getRecord, { recordId: "$recordId", fields })
35  wiredRecord({ error, data }) {
36    if (error) {
37      this.dispatchToast(error);
38    } else if (data) {
39      fields.forEach((item) => (this[item.fieldApiName] = getFieldValue(data, item)));
40    }
41  }
42
43  @wire(MessageContext)
44  messageContext;
45
46  // Encapsulate logic for Lightning message service subscribe and unsubsubscribe
47  subscribeToMessageChannel() {
48    if (!this.subscription) {
49      this.subscription = subscribe(
50        this.messageContext,
51        recordSelected,
52        (message) => this.handleMessage(message),
53        { scope: APPLICATION_SCOPE },
54      );
55    }
56  }
57
58  unsubscribeToMessageChannel() {
59    unsubscribe(this.subscription);
60    this.subscription = null;
61  }
62
63  // Handler for message received by component
64  handleMessage(message) {
65    this.recordId = message.recordId;
66  }
67
68  // Standard lifecycle hooks used to subscribe and unsubsubscribe to the message channel
69  connectedCallback() {
70    this.subscribeToMessageChannel();
71  }
72
73  disconnectedCallback() {
74    this.unsubscribeToMessageChannel();
75  }
76
77  // Helper
78  dispatchToast(error) {
79    this.dispatchEvent(
80      new ShowToastEvent({
81        title: "Error loading contact",
82        message: reduceErrors(error).join(", "),
83        variant: "error",
84      }),
85    );
86  }
87}

LightningElement でないサービスコンポーネントを作成する場合、@wire(MessageContext) を使用して MessageContext オブジェクトを作成することはできません。代わりに、createMessageContext() メソッドと releaseMessageContext() メソッドを lightning/messageService からインポートします。createMessageContext() を使用してコンテキストオブジェクトを作成し、それを messageContext などの項目に割り当てます。次に、messageContextsubscribe() メソッドに渡します。コンテキストはサービスコンポーネントに対して自動的に開放されません。releaseMessageContext(messageContext) をコールして、コンポーネントのメッセージコンテキストに関連付けられた登録を削除します。

Note

関連トピック

The Japanese Summer '24 guide is now live

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