За замовчуванням кожен перехід в Inertia - це запит до контролера Laravel, який обчислює всі props сторінки. Для сторінки зі списком і фільтрами зміна одного фільтра означала б заново обчислити й довідники, і статистику, і все інше.
Часткове перезавантаження - запит лише потрібних props для поточної сторінки:
import { router } from '@inertiajs/react';
function CompanyFilter({ companies }) {
return (
<select
onChange={(e) =>
router.reload({
data: { company: e.target.value },
only: ['users'], // повернути лише список користувачів
})
}
>
{companies.map((c) => <option key={c.id} value={c.id}>{c.name}</option>)}
</select>
);
}
only: [...]- які props повернути;except: [...]- які пропустити;router.reload()- скорочення для візиту на поточну URL; часткові перезавантаження працюють лише для тієї самої сторінки (того самого компонента).
Чому замикання на сервері обов'язкові. Сервер повертає лише запитані props, але щоб їх не обчислювати, значення мають бути ледачими:
return Inertia::render('Users/Index', [
'users' => fn () => User::query()->filter(request()->only('company'))->paginate(20),
'companies' => fn () => Company::orderBy('name')->get(['id', 'name']),
'stats' => fn () => $statsService->heavyCalculation(),
]);
Без fn () => запит до companies і важкий stats виконуються на кожному запиті, навіть якщо їх потім викинуть з відповіді.
Інші типи props Inertia (v3):
Inertia::optional(fn () => ...)- не надсилається при звичайних переходах, лише коли явно запитаний черезonly(ранішеInertia::lazy, видалено у v3);Inertia::defer(fn () => ...)- сторінка рендериться без цього prop, а він довантажується окремим запитом одразу після показу (повільна статистика);Inertia::merge(...)- нові дані дописуються до наявних, а не замінюють їх (нескінченний скрол, «Завантажити ще»);Inertia::once(...)- обчислюється один раз і запам'ятовується клієнтом між переходами.
Пастки:
- назва prop в
onlyмає точно збігатися з ключем у контролері - помилка в назві мовчки дає «нічого не оновилося»; - спільні дані (з
HandleInertiaRequests) теж підпадають підonly/except- для них правило замикань те саме; - стан сторінки: часткове перезавантаження за замовчуванням зберігає стан компонента (
preserveState) - фільтри й введені значення не скидаються.
Докладніше в документації: Inertia: часткові перезавантаження