コンポーネントが所有する要素へのアクセス
Shadow DOM
Light DOM
混合 Shadow モード (開発者プレビュー)
モバイル対応のコンポーネント
コンポーネントによって表示された要素に標準の DOM API でアクセスするには、querySelector() と、this.template または this を使用します。セレクタを使わずに DOM 内の要素を探すには、ref を使用します。
DOM で要素へアクセスするための一般的な方法は、querySelector() を使用することです。Shadow DOM ノードを探すには、this.template の querySelector() または querySelectorAll() を使用します。Light DOM ノードの場合は、this でいずれかのメソッドを使用します。
1// shadow DOM
2this.template.querySelector("div");
3
4// light DOM
5this.querySelector("div");{element}.template.querySelector を使用することもできます。
Note
コンポーネントが表示した要素を探すには、これらのメソッドを使用します。
querySelector の結果で返されません。querySelector で ID セレクタは使用しないでください。HTML テンプレートに定義した ID は、テンプレートの表示時にグローバルに一意な値に変換される場合があります。JavaScript の ID セレクタを使用する場合、その ID は、変換された ID に一致しません。this.querySelector() は、Light DOM の子など、即時テンプレート外の要素を検索します。より限定的なセレクタを使用して、メソッドの範囲を絞り込んでください。1<!-- example.html -->
2<template>
3 <div>First <slot name="task1">Task 1</slot></div>
4 <div>Second <slot name="task2">Task 2</slot></div>
5</template>1// example.js
2import { LightningElement } from "lwc";
3
4export default class Example extends LightningElement {
5 renderedCallback() {
6 this.template.querySelector("div"); // <div>First</div>
7 this.template.querySelector("span"); // null
8 this.template.querySelectorAll("div"); // [<div>First</div>, <div>Second</div>]
9 }
10}DOM 要素のクエリでグローバルプロパティの window や document は使用しないでください。「DOM のアクセスコンテインメント」を参照してください。また、lightning/platformResourceLoader 経由でサードパーティライブラリを操作していない場合には、JavaScript を使用して DOM を操作することはお勧めできません。宣言コードを記述するときは、Lightning Web コンポーネントの HTML ディレクティブを使用した方がよいでしょう。
Important
ref は、セレクタなしで DOM 要素を見つけ、指定されたテンプレートに含まれる要素のみを照会します。まず、lwc:ref ディレクティブを要素に追加し、値を割り当てます。その参照をコールするには、this.refs を使用します。次の例では、<div> 要素に lwc:ref="myDiv" ディレクティブがあり、実行時、this.refs によって参照され、<div> へのアクセスが行われます。
1<template>
2 <div lwc:ref="myDiv"></div>
3</template>1export default class extends LightningElement {
2 renderedCallback() {
3 console.log(this.refs.myDiv);
4 }
5}this.refs をコールするには、あらかじめディレクティブ lwc:ref を定義しておく必要があります。存在しない ref に this.refs をコールすると、undefined が返されます。テンプレートに lwc:ref ディレクティブが重複して含まれている場合、this.refs は最後の <div> を参照します。
1<template>
2 <div lwc:ref="myDiv"></div>
3 <div lwc:ref="myDiv"></div>
4</template>this.refs は、参照のみのプレーンなオブジェクトです。そのコンポーネントの内部でプロパティを追加、変更、または削除しようとすると、ランタイムエラーが発生します。キーは文字列で、値は DOM 要素です。this.refs の構文は、Light DOM や Shadow DOM の要素を参照する場合と同じです。
ref は設定と書き込みが可能であるため、コンポーネントで定義された ref は LightningElement.prototype の ref を上書きします。
<template> 要素や、Light DOM の <slot> 要素に lwc:ref を適用することはできません。
1<template lwc:render-mode="light">
2 <template lwc:if={myTemplate} lwc:ref="myTemplate"></template>
3 <!-- Not allowed -->
4</template>1<template lwc:render-mode="light">
2 <slot lwc:ref="mySlot"></slot>
3 <!-- Not allowed -->
4</template>for:each や iterator:* ループの内に lwc:ref を置くと、テンプレートコンパイラでエラーが発生します。
1<template for:each={items} for:item="item">
2 <div key={item} lwc:ref="foo"></div>
3 <!-- Not allowed -->
4</template>this.refs は、複数テンプレートのコンポーネントでは、最後に表示されたテンプレートを参照します。テンプレートが変更されると、this.refs オブジェクトも変更されます。
1import a from "./a.html";
2import b from "./b.html";
3
4export default class extends LightningElement {
5 count = 0;
6
7 render() {
8 return this.count % 2 === 0 ? a : b;
9 }
10
11 renderedCallback() {
12 console.log(this.refs);
13 }
14
15 increment() {
16 this.count++;
17 }
18}
19
20const cmp = createElement("c-component", { is: Component });
21// Logs `this.refs` for a.html
22
23cmp.increment();
24// Logs `this.refs` for b.html
25
26cmp.increment();
27// Logs `this.refs` for a.html<template lwc:if={boolean}> に基づいて要素を条件付きで定義するには、1 つの親テンプレートの下に複数の子テンプレートを作成します。この例では、this.refs.toggleDarkMode は、表示された子テンプレートの中の要素を参照します。
1<template>
2 <template lwc:if={darkMode}>
3 <button lwc:ref="toggleDarkMode">Enable Light Mode</button>
4 </template>
5 <template lwc:else>
6 <button lwc:ref="toggleDarkMode">Enable Dark Mode</button>
7 </template>
8</template>関連トピック
The Japanese Summer '24 guide is now live