LWC のイベントは、コンポーネントと通信するために使用されます。関連するコンポーネントがある場合、親から子へ、または子から親へ通信できる可能性があります。無関係なコンポーネントが 2 つある場合は、PubSub (パブリッシュ-サブスクライブ) モデルまたは Lightning Message Service (LMS) を介して通信できます。このガイドでは、PubSub モデルを使用して、親から子、子から親へのイベント、および相互に関連するコンポーネントと通信する方法について説明します。
コンポーネントは、レコード ページ、アプリ ページ、またはホームページに配置できます。コード スニペットの例では、このファイル (meta-xml) を再度指定しません。
XML バージョン = 「1.0」 ?>
< LightningComponentBundle xmlns = 'http://soap.sforce.com/2006/04/metadata' >
< APIバージョン > 57.0 APIバージョン >
< 露出しています > 真実 露出しています >
< ターゲット >
< 目標 > lightning__RecordPage 目標 >
< 目標 > lightning__AppPage 目標 >
< 目標 > lightning__ホームページ 目標 >
ターゲット >
ライトニングコンポーネントバンドル >
親から子のコミュニケーション
2 つのコンポーネントが相互に関連している場合、この通信は可能です。ここで、親はデータを子に送信します。親コンポーネントは子コンポーネントを保持します。このアプローチでは、プリミティブ データ (整数、文字列、ブール値など) を親から子に渡し、非プリミティブ データ (配列、オブジェクト、オブジェクトの配列など) を親から子に渡し、そのデータを子に渡すことができます。親に対するアクションを持つ子コンポーネント。
親から子に通信するには、子コンポーネントで使用できるフィールド、プロパティ、およびメソッドを公開する必要があります。これは、フィールド、プロパティ、メソッドを「api」デコレータで装飾することで可能になります。
例 : 子コンポーネントの「js」ファイル内で「api」で変数を宣言します。
@ API変数 ;
現在、親コンポーネントは、HTML 属性を介して HTML ファイル内の子コンポーネントを使用します。
例 : 親 HTML ファイル内の変数を使用します。
< c - 子供 - コンプ変数 > c - 子供 - コンプ >
親から子へのコミュニケーション方法を説明する例をいくつか見てみましょう。
例 1:
この基本的な例は、親から子に送信される情報を取得する方法を示しています。
childtComp.js
まず、公開されている「情報」変数を保持する子コンポーネントを作成します。
// API Decorator を使用して変数を public として宣言します@ API情報
次のスクリーンショットで「js」コード全体を確認できます。
childtComp.html
ここで、HTML ファイルの中央のタグ内でこの変数を指定します。
< テンプレート >< 稲妻 - カードタイトル = '子供' >
< 中心 >
< b > { 情報 } b >
中心 >
稲妻 - カード >
テンプレート >
親Comp.js
「js」ファイルでは何もしていません。
親Comp.html
パブリック変数 (情報) とテキストを渡して、前の子コンポーネントを親 HTML に配置します。
< テンプレート >< 稲妻 - カードタイトル = '親' アイコン - 名前 = 「標準:アカウント」 >
< c - 子供 - コンプ
情報 = 「こんにちは、情報を頂きました…」
> c - 子供 - コンプ >
稲妻 - カード >
テンプレート >
出力:
次に、Salesforce 組織に移動し、親コンポーネントを「レコード」ページに配置します。子コンポーネントが親から情報を受信したことがわかります。
例 2:
親コンポーネントの UI からテキストを動的に受け入れる 2 つの入力テキスト フィールドを作成しましょう。最初のテキストを親コンポーネントに挿入すると、子コンポーネントはこのテキストを大文字で受け取ります。同様に、2 番目のテキストを挿入すると、テキストが小文字で受信されます。
childtComp.js
トラック デコレータを使用して 2 つの変数、information1 と information2 を作成します。
- 最初の入力テキストを大文字に変換する「api」デコレータを使用して、convertToUpper() メソッドを作成します。
- 2 番目の入力テキストを小文字に変換する「api」デコレータを使用して、convertToLower() メソッドを作成します。
@ トラック情報2 ;
@ API
上位に変換 ( 実際の情報1 ) {
これ 。 情報1 = 実際の情報1. 大文字へ ( ) ;
}
@ API
下位に変換 ( 実際の情報1 ) {
これ 。 情報2 = 実際の情報1. 小文字へ ( ) ;
}
「js」コード全体は次のようになります。
childtComp.html
「js」ファイルから取得した値 (情報 1 と情報 2) を表示します。
< テンプレート >< 稲妻 - カードタイトル = '子供' >
大文字 :& 注意 ; < b > { 情報1 } b >< br >
小文字 :& 注意 ; < b > { 情報2 } b >
稲妻 - カード >
テンプレート >
親Comp.js
querySelector() を通じて子 HTML テンプレートを選択する 2 つのハンドラー メソッドを作成します。テキストを大文字または小文字に変換する正しいメソッドを渡す必要があることを確認してください。
ハンドルイベント1 ( イベント ) {これ 。 テンプレート 。 クエリセレクター ( 「c-childt-comp」 ) 。 上位に変換 ( イベント。 目標 。 価値 ) ;
}
ハンドルイベント2 ( イベント ) {
これ 。 テンプレート 。 クエリセレクター ( 「c-childt-comp」 ) 。 下位に変換 ( イベント。 目標 。 価値 ) ;
}
「js」コード全体は次のようになります。
親Comp.html
両方のハンドル イベントを含む入力テキストを作成します。この親コンポーネントに子コンポーネントを配置します。
< テンプレート >< 稲妻 - カードタイトル = '親' >
< 中心 >
< 稲妻 - 入力ラベル = 「テキストを小文字で入力してください」 変更中 = { ハンドルイベント1 } > 稲妻 - 入力 >
中心 >
< br >< br >
< 中心 >
< 稲妻 - 入力ラベル = 「文字を大文字で入力してください」 変更中 = { ハンドルイベント2 } > 稲妻 - 入力 >
中心 >
< br >< br >< br >
< c - 子供 - コンプ > c - 子供 - コンプ >
稲妻 - カード >
テンプレート >
出力:
次に、Salesforce 組織に移動し、親コンポーネントを「レコード」ページに配置します。
UI には 2 つのテキスト入力が表示されます。
最初の入力にテキストを書いてみましょう。テキストが大文字に変換され、子コンポーネントに表示されることがわかります。
2 番目の入力にテキストを書き込むと、テキストが小文字に変換され、子コンポーネントに表示されることがわかります。
子どもから親へのコミュニケーション
前の通信と同様に、子を親に通信するには、両方のコンポーネントが相互に関連している必要があります。子を親に伝えるには、3 つの異なるアプローチを使用できます。単純なイベントを使用して親を子に呼び出す方法と、データとイベント バブリングを含むイベントを使用して親を子に呼び出す方法です。このガイドでは単純なイベントを見ていきます。
子を親に通信するには、イベントを作成して送信する必要があります。そのためには、カスタム イベントを作成する必要があります。カスタムイベントとは、自分で作成したイベントのことです。 new キーワードを使用して作成できます。 Event_Name には任意の名前を指定できます (大文字または数字を超えない文字列にすることができます)。現時点では、オプションについては説明しません。
構文 : new CustomEvent('イベント名',{オプション…})
これでカスタム イベントが完成しました。次のステップは、イベントをディスパッチすることです。イベントをディスパッチするには、EventTarget.dispatchEvent() メソッドで作成したイベントを指定する必要があります。
構文 : this.displatchEvent(new CustomEvent(‘Event_Name’,{options…})
最後に、イベントを処理する必要があります。次に、親コンポーネントで子コンポーネントを呼び出す必要があります。イベント名に「on」接頭辞を指定して、イベント名を渡します。これはイベント リスナー ハンドラーを受け取ります。
構文:
< c - 子供 - イベント名のコンポーネント = { リスナーハンドラ } > c - 子供 - 成分 >例:
この例では、1 つの親コンポーネント (exampleParent) と 2 つの子コンポーネントを作成します。
- 最初の子 (exampleChild) では、ユーザーがテキストを入力できるようにする入力テキストを作成します。同じテキストが親コンポーネントに大文字で表示されます。
- 2 番目の子 (child2) では、ユーザーがテキストを入力できるようにする入力テキストを作成します。同じテキストが親コンポーネントに小文字で表示されます。
exampleChild.js
詳細をターゲット値として「linuxhintevent1」カスタムイベントを作成する handleChange1 メソッドを作成します。その後、このイベントを送信します。この「js」ファイルに次のスニペットを埋め込みます。
// イベントを処理するハンドル変更1 ( イベント ) {
イベント。 デフォルトを防ぐ ( ) ;
定数 名前1 = イベント。 目標 。 価値 ;
定数 選択イベント1 = 新しい カスタムイベント ( 'linuxhintevent1' 、 {
詳細 : 名前1
} ) ;
これ 。 ディスパッチイベント ( 選択イベント1 ) ;
}
exampleChild.html
「js」で作成した先のハンドルメソッドは、HTMLコンポーネントのLightning入力に基づいて処理されます。
< テンプレート >< 稲妻 - カードタイトル = 「子供1」 >
< ディビジョン クラス = 「slds-m-around_medium」 >
< 稲妻 - 入力ラベル = 「テキストを小文字で入力してください」 変更中 = { ハンドル変更1 } > 稲妻 - 入力 >
ディビジョン >
稲妻 - カード >
テンプレート >
child2.js
詳細をターゲット値として「linuxhintevent2」カスタムイベントを作成する handleChange2 メソッドを作成します。その後、このイベントを送信します。
ハンドル変更2 ( イベント ) {イベント。 デフォルトを防ぐ ( ) ;
定数 名前2 = イベント。 目標 。 価値 ;
定数 選択イベント2 = 新しい カスタムイベント ( 「linuxhintevent2」 、 {
詳細 : 名前2
} ) ;
これ 。 ディスパッチイベント ( 選択イベント2 ) ;
}
child2.html
「js」で作成した先のハンドルメソッドは、HTMLコンポーネントのLightning入力に基づいて処理されます。
< テンプレート >< 稲妻 - カードタイトル = 「こども2」 >
< ディビジョン クラス = 「slds-m-around_medium」 >
< 稲妻 - 入力ラベル = 「テキストを大文字で入力してください」 変更中 = { ハンドル変更2 } > 稲妻 - 入力 >
ディビジョン >
稲妻 - カード >
テンプレート >
例Parent.js: このスニペットをクラス内の「js」ファイルに埋め込みます。
- handleEvent1() の toUpperCase() 関数を使用して入力を大文字に変換し、 Information1 変数に保存します。
- handleEvent2() の toLowerCase() 関数を使用して入力を小文字に変換し、 Information2 変数に保存します。
// toUpperCase() 関数を使用して入力を大文字に変換します
// handleEvent1() 内で Information1 変数に格納します
handleEvent1(イベント) {
const input1 = イベント.詳細;
this.Information1 = input1.toUpperCase();
}
@トラック情報2;
// toLowerCase() 関数を使用して入力を小文字に変換します
// handleEvent2() で Information2 変数に格納します
handleEvent2(イベント) {
const input2 = イベント.詳細;
this.Information2 = input2.toLowerCase();
}
exampleParent.html
次に、両方の子コンポーネントを指定して、親 HTML コンポーネントの 2 つの変数 (Information1 と Information2) を表示します。
<テンプレート><稲妻カード タイトル = '親' >
< ディビジョン クラス = 「slds-m-around_medium」 >
Child-1 の大文字のメッセージ: < b > {情報1} < / b >< br >
Child-2 の小文字のメッセージ: < b > {情報2} < / b >< br >
< / b >< br >
< / ディビジョン >
< / ライトニングカード>
< / テンプレート>
出力:
次に、Salesforce 組織に移動し、親コンポーネントを「レコード」ページに配置します。
親コンポーネントの中に 2 つの子コンポーネントが存在することがわかります。
Child 1 コンポーネントの下の入力テキストにテキストを入力してみましょう。親コンポーネントではテキストが大文字で表示されていることがわかります。
Child 2 コンポーネントの下の入力テキストにテキストを入力します。親コンポーネントではテキストが小文字で表示されていることがわかります。
一度に両方のテキストを入力することもできます。
パブリッシュサブモデル
独立したコンポーネント (相互に関連していない) を操作する場合、およびあるコンポーネントから別のコンポーネントに情報を送信する場合は、このモデルを使用できます。 PubSub はパブリッシュとサブスクライブの略です。データを送信するコンポーネントはパブリッシャと呼ばれ、データを受信するコンポーネントはサブスクライバと呼ばれます。コンポーネント間でイベントを送信するには、pubsub モジュールを使用する必要があります。これはすでに事前定義されており、Salesforce によって提供されています。ファイル名はpubsubです。 LWC コンポーネントを作成し、JavaScript ファイル「pubsub.js」にこのコードを入力する必要があります。
例:
Publish と Subscribe という 2 つのコンポーネントを作成しましょう。
パブリッシュでは、ユーザーが入力テキストを作成できるようにします。ボタンをクリックすると、Subscribe コンポーネントではデータが大文字と小文字で受信されます。
.js を公開する
このコードを JSON ファイルに埋め込みます。ここでは情報を取得し、情報を公開します。
information 変数は大文字、information1 は小文字になります。コードの先頭にこの import ステートメントを必ず含めてください (「c/pubsub」から pubsub をインポートします)。
情報情報2
// 大文字と小文字の情報を取得します
情報ハンドラ ( イベント ) {
これ 。 情報 = イベント。 目標 。 価値 ;
これ 。 情報2 = イベント。 目標 。 価値 ;
}
// 両方の情報を公開します (大文字と小文字)
パブリッシュハンドラ ( ) {
パブサブ。 公開 ( '公開' 、 これ 。 情報 )
パブサブ。 公開 ( '公開' 、 これ 。 情報2 )
}
次のようになります。
公開.html
まず、ハンドラー情報を含むテキストを受け入れるための lightning-input を作成します。その後、onclick 機能を使用してボタンが 1 つ作成されます。これらの関数は、前の「js」コード スニペットに含まれています。
<テンプレート><稲妻カード タイトル = 「テキストを公開する」 >
<雷入力 タイプ = '文章' オンキーアップ = { 情報ハンドラ } >< / 雷入力>
<稲妻ボタン クリック時 = { パブリッシュハンドラ } ラベル = 'データを送る' >< / ライトニングボタン>
< / ライトニングカード>
< / テンプレート>
購読.js
このコードを JSON ファイルに埋め込みます。ここでは、まず callSubscriber() メソッド内で情報を大文字と小文字に別々に変換して情報をサブスクライブします。その後、connectedcallback() メソッドを通じてこのメソッドを呼び出します。コードの先頭にこの import ステートメントを必ず含めてください (「c/pubsub」から pubsub をインポートします)。
情報情報2
// callSubscriber() を呼び出します
接続済みコールバック ( ) {
これ 。 通話加入者 ( )
}
// 情報を大文字に変換してサブスクライブします
通話加入者 ( ) {
パブサブ。 購読する ( '公開' 、 ( 情報 ) => {
これ 。 情報 = 情報。 大文字へ ( ) ;
} ) 、
// 情報を小文字に変換してサブスクライブします
パブサブ。 購読する ( '公開' 、 ( 情報2 ) => {
これ 。 情報2 = 情報2. 小文字へ ( ) ;
} )
}
次のようになります。
購読する.html
テキストは大文字 (information に保存) と小文字 (information2 に保存) で表示します。
<テンプレート><稲妻カード タイトル = '購読する' >
< ディビジョン クラス = 「slds-p-around_medium」 >
大文字で受け取った情報 - < b > {情報} < / b >< br >
小文字で受け取った情報 - < b > {情報2} < / b >
< / ディビジョン >
< / ライトニングカード>
< / テンプレート>
出力:
これら 2 つのコンポーネントをページに追加します。両方のコンポーネントが同じページにあることを確認してください。そうしないと、機能が動作しません。
「Publish」コンポーネントにテキストを入力し、「Send Data」ボタンをクリックしてみましょう。テキストが大文字と小文字で受信されていることがわかります。
結論
これで、Salesforce LWC のイベント概念を通じて LWC コンポーネントと通信できるようになりました。このガイドの一環として、親から子へ、そして子から親へコミュニケーションを図る方法を学びました。 PubSub モデルは、コンポーネントが互いに関連していない (親と子ではない) 場合に使用されます。各シナリオは簡単な例で説明されており、このガイドの冒頭で提供されているコードを「meta-xml」ファイルに必ず含めてください。