2025.07.31

ロード中の「ぐるぐる」問題を解決!LWCでユーザーフレンドリーなコンポーネントを作る

Just a moment... (37769)

はじめに

記事をご覧の皆様、こんにちは!

フローやLWC(Lightning Web Component)でコンポーネントを作成する際、情報の多いデータテーブルなどロードに時間がかかるものもありますよね。読み込み中に画面が固まってしまうと、「データがまだないのか?」「それとも今ロード中なのか?」とユーザーを混乱させてしまうことがあります。これではせっかくのコンポーネントも使い勝手が良いとは言えません。

この問題点を解決し、もっとユーザーに分かりやすいコンポーネントを作るための秘策があります。それは、皆さんもよく目にするあの「ぐるぐる」を表示することです!

「ぐるぐる」の正体は「スピナー」

この記事では親しみを込めて「ぐるぐる」と表現していましたが、この正式名称はスピナーと言います。視覚的に「今、処理中ですよ」と伝えることでユーザーは待つべき状況を理解し、ストレスなく操作を続けることができます。本記事では以降、この「スピナー」という言葉を使っていきますね。

「そもそもスピナーって標準で搭載されていないの?」と感じた方もいるかもしれません。ご安心ください、フローに関しては標準でスピナーの機能が搭載されています。例えば、特定の処理中に自動的にスピナーが表示され、ユーザーにロード中であることを伝えてくれます。

次のセクションでは、LWCでこのスピナーを実装する方法やさらに効果的に利用するためのヒントについて詳しく解説していきます。一緒に、よりユーザーフレンドリーなコンポーネントを作成していきましょう!

LWCでは一工夫必要? 標準機能だけではスピナーが表示されない!

残念ながら、LWCではコード内にスピナーの機能を明示的に記述しない限り標準では自動でスピナーを表示してはくれません。

下記「ロード時のデータテーブル」をご覧ください、この状態ではどうでしょう?ロードに数秒かかる場合でも、画面上は何も変化がなく、まるで止まってしまったかのように見えてしまいます。そして急に写真二枚目の「データ表示」のように画面表示されます。ユーザーは「データがまだ反映されていないのか?」「それともシステムが固まってしまったのか?」ととまどってしまうかもしれません。これでは、せっかくの素晴らしい機能も、ユーザーにとっては使いにくいUIになってしまいますね。

ロード時のデータテーブル

データ表示

LWCでデータロード時にスピナーを表示する方法

スピナーコンポーネントの記述方法

LWCには標準でスピナーコンポーネントが用意されており、データロードのタイミングで簡単に表示・非表示を切り替えることができます。
スピナーを表示するには、まずHTMLテンプレートにlightning-spinnerタグを追加します。
<template if:true={isLoading}>
          <lightning-spinner alternative-text="読み込み中" size="medium"></lightning-spinner>
</template>
spinner.html
上記のコードでは、isLoadingという真偽値プロパティがtrueの場合にスピナーが表示されます。alternative-text属性はスピナーが表示された際にスクリーンリーダーが読み上げるテキスト、size属性はスピナーのサイズを指定します。

データ読み込み時のスピナー表示制御

次に、JavaScriptファイルでデータの読み込み状況に応じてisLoadingプロパティを制御します。ここでは、APIコールなどデータ取得に時間がかかる処理を想定し、setTimeoutを使用して非同期処理をシミュレートする例を示します。
import { LightningElement, track } from 'lwc';

export default class Spinner extends LightningElement {
    @track data = [];
    columns = [
        { label: 'Label', fieldName: 'name' },
        { label: 'Website', fieldName: 'website', type: 'url' },
        { label: 'Phone', fieldName: 'phone', type: 'phone' },
        { label: 'Balance', fieldName: 'amount', type: 'currency' },
        { label: 'CloseAt', fieldName: 'closeAt', type: 'date' }
    ];
    
    @track isLoading = true;

    connectedCallback() {
        this.loadData();
    }

    

    loadData() {
        this.isLoading = true;

        // データを非同期で取得
        setTimeout(() => {
            this.data = generateData({ amountOfRecords: 1000 });
            this.isLoading = false; 
        }, 1000);
    }

    handleReload(){
        this.loadData();
    }
}


function generateData({ amountOfRecords }) {
    return [...Array(amountOfRecords)].map((_, index) => {
        return {
            name: `Name (${index})`,
            website: 'https://www.salesforce.com',
            amount: Math.floor(Math.random() * 10000) / 100, 
            phone: `${Math.floor(Math.random() * 9000000000) + 1000000000}`,
            closeAt: new Date(
                Date.now() + 86400000 * Math.ceil(Math.random() * 20)
            ).toISOString().split('T')[0] 
        };
    });
}

spinner.js
上記の例では、コンポーネントがDOMに追加された直後にconnectedCallback()が呼び出され、loadData()メソッドが実行されます。

1.loadData()メソッドの最初にthis.isLoading = true;とすることでスピナーが表示されます。

2.setTimeout内でモックのデータロード処理を実行します(実際のアプリケーションではここにAPIコールなどを記述します)。

3.データロードが完了したら、this.isLoading = false;としてスピナーを非表示にします。

このように設定することで、ユーザーはデータがロードされている間も、スピナーを通じて処理が進行中であることを視覚的に確認できるようになり、よりスムーズなアプリケーション体験を提供できます。

完成イメージ

スピナーを部分的に表示する方法

なぜ部分的なスピナー表示が必要なのか?

現状、以下のような状況でスピナーが意図しない範囲に表示されてしまうことがあります。

・「スピナー付きデータテーブル」 というタイトル部分

・「関連リスト再描画」 ボタン部分

これらがスピナーの範囲に含まれてしまうと、ユーザーはデータテーブル以外の部分も読み込み中だと誤解し、操作に支障をきたす可能性があります。データテーブルのみにスピナーを表示させることで、ユーザーはサイトのどこが現在処理中なのかを明確に理解できるようになります。

CSS の position プロパティを活用しよう

この課題を解決するには、CSS の position プロパティが非常に役立ちます。デフォルトでは、ほとんどの要素の position は static に設定されていますが、今回は**position: relative** を使用します。
まず、スピナーの配置基準となるコンテナ(div 要素など)をデータテーブルの周りに用意します。このコンテナに、任意のクラス名(例: spinner-container)を付与しましょう。
<div class="spinner-container">
    <lightning-datatable ...></lightning-datatable>

    <template if={isLoading}>
        <lightning-spinner alternative-text="読み込み中" size="medium"></lightning-spinner>
    </template>
</div>
spinner.html
次に、上記で作成したコンテナに position: relative を設定します。これにより作成したコンテナがスピナーの基準位置となります。
.datatable-wrapper {
    position: relative;
}
spinner.css
上記の処理を行うことで、データテーブル部分のみにスピナーが表示され、ユーザーは他の要素が通常通り操作可能であることを明確に認識できます。

完成イメージ

最後に

いかがでしたでしょうか?
スピナー自体がサイトの主要な機能として扱われることは少ないかもしれません。しかし、ユーザーが何かを待っている間に「今、処理中ですよ」という明確なフィードバックを提供することは、サイトの使いやすさに大きく貢献します。
例えば、

・データが読み込まれるまでの空白の時間に不安を感じさせない。

・ユーザーが何度もクリックしてしまうのを防ぐ。

・サイトがフリーズしているわけではないことを示す。

といった効果が期待できます。特にデータ量の多いテーブルや複雑な処理を伴うコンポーネントでは、適切に配置されたスピナーがユーザーのストレスを軽減し、よりスムーズな操作体験を提供します。

皆さんもぜひ使ってみてください!
33 件
     
  • banner
  • banner

関連する記事