You're viewing the Inertia.js v2.0 documentation. Upgrade guide →
Inertia's deferred props feature allows you to defer the loading of certain page data until after the initial page render. This can be useful for improving the perceived performance of your app by allowing the initial page render to happen as quickly as possible.
To defer a prop, you can use the defer
method when returning your response. This method recieves a callback that returns the prop data. The callback will be executed in a separate request after the initial page render.
Route::get('/users', function () {
return Inertia::render('Users/Index', [
'users' => User::all(),
'roles' => Role::all(),
'permissions' => Inertia::defer(fn () => Permission::all()),
]);
});
By default, all deferred props get fetched in one request after the initial page is rendered, but you can choose to fetch data in parallel by grouping props together.
Route::get('/users', function () {
return Inertia::render('Users/Index', [
'users' => User::all(),
'roles' => Role::all(),
'permissions' => Inertia::defer(fn () => Permission::all()),
'teams' => Inertia::defer(fn () => Team::all(), 'attributes'),
'projects' => Inertia::defer(fn () => Project::all(), 'attributes'),
'tasks' => Inertia::defer(fn () => Task::all(), 'attributes'),
]);
});
In the example above, the teams
, projects
, and tasks
props will be fetched in one request, while the permissions
prop will be fetched in a separate request in parallel. Group names are arbitrary strings and can be anything you choose.
On the client side, Inertia provides the Deferred
component to help you manage deferred props. This component will automatically wait for the specified deferred props to be available before rendering its children.
<script setup>
import { Deferred } from '@inertiajs/vue3'
</script>
<template>
<Deferred data="permissions">
<template #fallback>
<div>Loading...</div>
</template>
<div v-for="permission in permissions">
<!-- ... -->
</div>
</Deferred>
</template>
If you need to wait for multiple deferred props to become available, you can specify an array to the data
prop.
<script setup>
import { Deferred } from '@inertiajs/vue3'
</script>
<template>
<Deferred :data="['teams', 'users']">
<template #fallback>
<div>Loading...</div>
</template>
<!-- Props are now loaded -->
</Deferred>
</template>