子コンポーネントでのメソッドのコール

公開メソッドを公開するには、公開メソッドを @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-playerplay() および 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-callerhandlePlay および 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-callerhandlePlay() 関数は c-video-player 要素の play() メソッドをコールします。this.template.querySelector('c-video-player')methodCaller.htmlc-video-player 要素を返します。子コンポーネントにアクセスしてそのコンポーネントのメソッドをコールできるようにするには、this.template.querySelector() コールが便利です。

c-method-callerhandlePause() 関数は c-video-player 要素の pause() メソッドをコールします。

戻り値 

JavaScript メソッドからの値を返すには、return ステートメントを使用します。たとえば、c-video-playerisPlaying() メソッドを参照してください。

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 要素の配列を返します。

idquerySelector などのクエリメソッドに渡さないでください。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

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