見出し画像

知っておくと便利!Lightning Web Componentsのslotの使い方。

Vue.jsでおなじみのslotが、Lightning Web Componentsでもサポートされています。

使い方をマスターしておくと、コンポーネント開発の幅が広がります。

slotとは何か?

slotとは、自分のコンポーネント内部の一部を外部から変更できる仕組みです。

画像1

上図のように親コンポーネントに子コンポーネントを配置していて、子コンポーネントの中でslotを定義していると、その中を親コンポーネントから変更することができます。

slotの使い方

以下のようなlightning-cardを使ってメッセージを表示するコンポーネントChildComponentで説明します。

画像2

カードの内容をslotにする場合、以下のように実装します。

<template>
 <lightning-card title="カードタイトル">
   <slot>
     <p>カードの内容</p>
   </slot>
 </lightning-card>
</template>

このコンポーネントを親コンポーネントで使うには、以下のように実装します。

<template>
 <c-child-component>
 </c-child-component>
</template>

では、親コンポーネントからコンポーネントChildComponentを以下のように表示するにはどうしたらいいでしょうか?

画像3

コンポーネントChildComponentでは、「カードの内容」の部分がslotとして定義していました。

以下のようにすると、コンポーネントChildComponentのslot部分を置き換えることができます。

<template>
 <c-child-component>
   <!-- ここから -->
   <div>
     <img src="logo.png">
   </div>
   <div>
     <p>これはロゴです</p>
   </div>
   <div>
     <lightning-button variant="brand" label="OK"></lightning-button>
   </div>
   <!-- ここまで -->
 </c-child-component>
</template>

名前付きslot

slotには名前を付けることができます。

<template>
 <lightning-card title="カードタイトル">
   <div>
     <slot name="card-image">
     </slot>
   </div>
   <div>
     <slot name="card-message">
     </slot>
   </div>
   <div>
     <slot name="card-action">
     </slot>
   </div>
 </lightning-card>
</template>

card-image、card-message、card-actionという名前付きslotを定義しています。

これを先ほどと同じように親コンポーネントで使う場合には以下のようになります。

<template>
 <c-child-component>
   <!-- ここから -->
   <img src="logo.png" slot="card-image">
   <p slot="card-message">これはロゴです</p>
   <lightning-button variant="brand" label="OK" slot="card-action"></lightning-button>
   <!-- ここまで -->
 </c-child-component>
</template>

@apiで子コンポーネントに値を渡して表示するという方法もありますが、slotを使った方が汎用性の高いコンポーネントを開発することができます。


この記事が気に入ったらサポートをしてみませんか?