0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

`refreshApex` とは?

Last updated at Posted at 2025-09-15

LWC における refreshApex の使い方まとめ

LWCで @wire を使って Apex メソッドを呼び出すと、結果はブラウザに キャッシュ されます。 この仕組みにより パフォーマンス向上無駄なサーバーリクエスト削減 が実現できますが、 キャッシュがあるために 更新直後のデータが UI に反映されない 場面もあります。
そのようなときに使うのが refreshApex です

1. refreshApex とは?

  • @wire で取得したデータを 再取得(最新化) するための関数
  • 内部的には キャッシュをクリア → サーバーに再問い合わせ → キャッシュ更新 を行う
  • 更新処理を行った後、最新状態を UI に反映したいときに使う

2. キャッシュと非同期の仕組み

  • @AuraEnabled(cacheable=true) を付けた Apex メソッドは、LWC 側で キャッシュ可能
  • 2回目以降の呼び出しはキャッシュからすぐに返される(表示が高速化される)
  • ただしキャッシュは「過去の取得データ」なので、最新ではない場合がある
  • その場合に refreshApex() を呼ぶことで、サーバーに再問い合わせして最新化できる

3. 使い方ステップ

3-1 refreshApexをインポートする:

import { refreshApex } from '@salesforce/apex';

3-2 Apexメソッドを@wireで呼び出す:

import { LightningElement, wire } from 'lwc';
import getAccounts from '@salesforce/apex/AccountController.getAccounts';

export default class AccountList extends LightningElement {
    accounts;
    wiredAccountsResult; // refreshApexで使うため保持

    @wire(getAccounts)
    wiredAccounts(result) {
        this.wiredAccountsResult = result; // refreshApex用
        if (result.data) {
            this.accounts = result.data;
        }
    }
}

3-3 refreshApex()を呼び出す:

handleRefresh() {
    refreshApex(this.wiredAccountsResult)
        .then(() => {
            console.log('最新データを取得しました');
        });
}

4. 使用例(更新処理と組み合わせる)

import { LightningElement, wire } from 'lwc';
import getAccounts from '@salesforce/apex/AccountController.getAccounts';
import updateAccount from '@salesforce/apex/AccountController.updateAccount';
import { refreshApex } from '@salesforce/apex';

export default class AccountList extends LightningElement {
    accounts;
    wiredAccountsResult;

    @wire(getAccounts)
    wiredAccounts(result) {
        this.wiredAccountsResult = result;
        if (result.data) {
            this.accounts = result.data;
        }
    }

    async handleUpdate() {
        // レコード更新(Imperative Apex 呼び出し)
        await updateAccount({ accountId: '001XXXXXXXXXXXX' });

        // 更新後に最新データを取得
        refreshApex(this.wiredAccountsResult);
    }
}

5. 注意点

  • refreshApex は wire で取得した結果オブジェクト にしか使えない
  • Imperative 呼び出しの戻り値には適用できない
  • 頻繁に呼びすぎるとネットワーク負荷が上がるため、必要なときだけ使うこと

5. まとめ

  • refreshApex =キャッシュ済みの wire データを最新化する関数
  • @AuraEnabled(cacheable=true) と組み合わせて使うのが前提
  • キャッシュの利便性 と 最新データの反映 を両立させるために欠かせない仕組み

6. 参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?