既に表示されている同じページにアクセスする場合、必ずしもサーバーからページの全データを再取得する必要はありません。実際、ページデータの一部が古くなることが許容される場合、データのサブセットのみを選択することは、パフォーマンスを最適化するのに役立つ場合があります。Inertiaは、「部分的な再読み込み」機能によってこれを可能にします。
例として、ユーザーのリストと、会社別にユーザーをフィルタリングするオプションを含む「ユーザーインデックス」ページを考えてみましょう。ページへの最初のリクエストでは、users
とcompanies
の両方のプロパティがページコンポーネントに渡されます。ただし、同じページへの後続の訪問(おそらくユーザーをフィルタリングするため)では、companies
データをリクエストせずに、サーバーからusers
データのみをリクエストできます。Inertiaは、サーバーから返された部分的なデータと、クライアント側で既にメモリにあるデータを自動的にマージします。 companies
部分的な再読み込みを実行するには、`only`訪問オプションを使用して、サーバーが返すデータを指定します。このオプションは、プロパティのキーに対応するキーの配列である必要があります。
import { router } from '@inertiajs/vue3'
router.visit(url, {
only: ['users'],
})
`only`訪問オプションに加えて、`except`オプションを使用して、サーバーが除外するデータを指定することもできます。このオプションも、プロパティのキーに対応するキーの配列である必要があります。
import { router } from '@inertiajs/vue3'
router.visit(url, {
except: ['users'],
})
部分的な再読み込みは、ユーザーが既に表示している同じページコンポーネントに対してのみ行うことができるため、現在のURLを自動的に使用するrouter.reload()
メソッドを使用するのがほぼ常に理にかなっています。
import { router } from '@inertiajs/vue3'
router.reload({ only: ['users'] })
only
プロパティを使用して、Inertiaリンクで部分的な再読み込みを実行することもできます。
import { Link } from '@inertiajs/vue3'
<Link href="/users?active=true" :only="['users']">Show active</Link>
部分的な再読み込みを最も効果的にするには、サーバー側のルートまたはコントローラーからプロパティを返すときに、遅延データ評価も使用してください。これは、すべてのオプションのページデータをクロージャでラップすることで実現できます。
return Inertia::render('Users/Index', [
'users' => fn () => User::all(),
'companies' => fn () => Company::all(),
]);
Inertiaがリクエストを実行すると、必要なデータが判別され、その場合にのみクロージャが評価されます。これは、オプションのデータが多数含まれているページのパフォーマンスを大幅に向上させることができます。
さらに、Inertiaは、only
オプションを使用して明示的にリクエストされない限り、プロパティを含めないように指定するInertia::lazy()
メソッドを提供します。
return Inertia::render('Users/Index', [
'users' => Inertia::lazy(fn () => User::all()),
]);
逆に、Inertia::always()
メソッドを使用して、部分的な再読み込みで明示的に要求されていない場合でも、プロパティを常に含めるように指定できます。
return Inertia::render('Users/Index', [
'users' => Inertia::always(User::all()),
]);
各アプローチの概要は次のとおりです。
return Inertia::render('Users/Index', [
// ALWAYS included on standard visits
// OPTIONALLY included on partial reloads
// ALWAYS evaluated
'users' => User::all(),
// ALWAYS included on standard visits
// OPTIONALLY included on partial reloads
// ONLY evaluated when needed
'users' => fn () => User::all(),
// NEVER included on standard visits
// OPTIONALLY included on partial reloads
// ONLY evaluated when needed
'users' => Inertia::lazy(fn () => User::all()),
// ALWAYS included on standard visits
// ALWAYS included on partial reloads
// ALWAYS evaluated
'users' => Inertia::always(User::all()),
]);