コンポーネントの構成
子のプロパティの設定
データフロー
子でのメソッドのコール
子のスプレッドプロパティ
スロットにマークアップを渡す
スロットとデータの比較
連動関係を参照
モバイル対応のコンポーネント
公開メソッドを公開するには、公開メソッドを @api でデコレートします。公開メソッドはコンポーネントの API の一部です。コンテインメント階層の下位と通信するには、オーナーと親コンポーネントは子コンポーネントの JavaScript メソッドをコールします。
コンテインメント階層の上位と通信するには、子コンポーネントでイベントを起動し、そのイベントをオーナーまたはコンテナコンポーネントで処理します。「イベントを使用した通信」を参照してください。
lwc-recipes リポジトリの apiMethod コンポーネント (旧称 apiFunction) をチェックアウトすると、その clock 子コンポーネントのメソッドがコールされます。
Note
次の例では、c-video-player コンポーネントの isPlaying プロパティの getter と play() および pause() メソッドを公開するために、それぞれに @api デコレータを追加しています。このプロパティの読み取りとこのメソッドのコールを実行できるのは、c-video-player を含む親コンポーネントです。JavaScript ファイルを次に示します。
1// videoPlayer.js
2import { LightningElement, api } from "lwc";
3
4export default class VideoPlayer extends LightningElement {
5 @api videoUrl;
6
7 @api
8 get isPlaying() {
9 const player = this.template.querySelector("video");
10 return player !== null && player.paused === false;
11 }
12
13 @api
14 play() {
15 const player = this.template.querySelector("video");
16 // the player might not be in the DOM just yet
17 if (player) {
18 player.play();
19 }
20 }
21
22 @api
23 pause() {
24 const player = this.template.querySelector("video");
25 if (player) {
26 // the player might not be in the DOM just yet
27 player.pause();
28 }
29 }
30
31 // private getter for computed value
32 get videoType() {
33 return "video/" + this.videoUrl.split(".").pop();
34 }
35}videoUrl は、公開プロパティです。@api デコレータを使用すると、コンポーネントの公開プロパティと公開 JavaScript メソッドを定義できます。公開プロパティは、コンポーネントの公開 API のもう 1 つの部分です。
テンプレートが所有する要素にアクセスする場合、コードは template プロパティを使用します。
Note
ここで、ビデオ要素が定義されている HTML ファイルを見てみましょう。
1<!-- videoPlayer.html -->
2<template>
3 <div class="fancy-border">
4 <video autoplay>
5 <source src={videoUrl} type={videoType} />
6 </video>
7 </div>
8</template>通常、実際のコンポーネントでは、c-video-player がビデオ自体の再生または一時停止を制御します。この例では、公開 API の設計を示すため、公開メソッドをコールする親コンポーネント内に制御があります。
c-method-caller コンポーネントには c-video-player が含まれており、c-video-player の play() および pause() メソッドをコールするボタンがあります。HTML は次のようになります。
1<!-- methodCaller.html -->
2<template>
3 <div>
4 <c-video-player video-url={video}></c-video-player>
5 <button onclick={handlePlay}>Play</button>
6 <button onclick={handlePause}>Pause</button>
7 </div>
8</template>c-method-caller の handlePlay および handlePause メソッドをワイヤリングした後、c-method-caller のボタンをクリックすると、c-video-player でビデオが再生または一時停止されます。
c-method-caller 用の JavaScript ファイルを次に示します。
1// methodCaller.js
2import { LightningElement } from "lwc";
3
4export default class MethodCaller extends LightningElement {
5 video = "https://www.w3schools.com/tags/movie.mp4";
6
7 handlePlay() {
8 this.template.querySelector("c-video-player").play();
9 }
10
11 handlePause() {
12 this.template.querySelector("c-video-player").pause();
13 }
14}c-method-caller の handlePlay() 関数は c-video-player 要素の play() メソッドをコールします。this.template.querySelector('c-video-player') は methodCaller.html の c-video-player 要素を返します。子コンポーネントにアクセスしてそのコンポーネントのメソッドをコールできるようにするには、this.template.querySelector() コールが便利です。
c-method-caller の handlePause() 関数は c-video-player 要素の pause() メソッドをコールします。
JavaScript メソッドからの値を返すには、return ステートメントを使用します。たとえば、c-video-player の isPlaying() メソッドを参照してください。
1@api get isPlaying() {
2 const player = this.template.querySelector('video');
3 return player !== null && player.paused === false;
4}データを JavaScript メソッドに渡すには、メソッドに 1 つ以上のパラメータを定義します。たとえば、play() メソッドを定義して、ビデオの再生速度を制御する speed パラメータを設定できます。
1@api play(speed) { … }querySelector() メソッドは、セレクタに最初に一致した要素を返す標準 DOM API です。
配列を反復処理する場合は、class 値や data-* 値などのその他の属性を要素に追加し、これを使用して目的の要素を選択することを検討してください。
querySelectorAll() メソッドは、DOM 要素の配列を返します。
id を querySelector などのクエリメソッドに渡さないでください。HTML テンプレートが表示されるときに、id 値がグローバルに一意な値に変換される場合があります。JavaScript の id セレクタを使用する場合、その ID は、変換された id に一致しません。
Note
詳細は、developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll および developer.mozilla.org/en-US/docs/Web/API/Element/querySelector を参照してください。
関連トピック
The Japanese Summer '24 guide is now live