InertiaJS Как использовать "Вложенные макеты" для вкладок?
Я надеялся получить дополнительную информацию о "вложенных макетах" в InertiaJS. Документация по нему очень скудная, и я едва могу найти какие-либо примеры, показывающие, как это работает, а документация на сайте не очень описывает, как это работает или что делает код. (https://inertiajs.com/pages)
В основном я хочу добиться функциональности, аналогичной описанной в этом твите;https://twitter.com/klaasgeldof/status/1181198792995037184
Надеюсь, кто-то сможет предоставить дополнительную информацию, потому что у меня было много проблем с тем, чтобы это работало правильно.
2 ответа
Добавить
<slot />
внутренняя вкладка
Теперь хитрость заключается в том, чтобы поместить два макета на вложенную страницу.
<script>
import SiteLayout from './SiteLayout'
import NestedLayout from './NestedLayout'
export default {
// Using a render function
layout: (h, page) => {
return h(SiteLayout, [
h(NestedLayout, [page]),
])
},
// Using the shorthand
layout: [SiteLayout, NestedLayout],
props: {
user: Object,
},
}
</script>
layout: [SiteLayout, NestedLayout]
вот где хитрость.
Есть много подходов к этому, и я бы сказал, что они больше связаны с вашим стеком внешнего интерфейса. Поскольку этот вопрос помечен тегом vue.js, я отвечу на этом основании.
Подход #1
Инерционная часть здесь просто создает макет, который, по сути, является просто компонентом vue. Затем этот макет содержит боковую и верхнюю навигацию и слот для заполнения основного содержимого. Затем вы можете создать компонент страницы панели мониторинга, который будет использовать этот макет, добавивlayout: myDashboardLayout
в экспорте.
Чтобы получить тот же эффект, вы в основном переходите к разным представлениям, которые передают разные слоты макету и их соответствующим данным.
// Your DashboardLayout.vue
<template>
<div>
<my-sidebar :data="foo" />
<my-topbar :data="bar" />
<slot name="dashboardContent" />
</div>
</template>
// Your Dashboard/Index.vue
<template>
<main slot="dashboardContent" :data="myData" />
</template>
<script>
import DashboardLayout from './DashboardLayout'
export default {
// Using the shorthand
layout: DashboardLayout,
}
</script>
//web.php
Route::get('/dashboard', function(){
return Inertia::render('Dashboard/Index', [data]);
});
Route::get('/dashboard/foo', function(){
return Inertia::render('Dashboard/Index', [fooData]);
});
Route::get('/dashboard/bar', function(){
return Inertia::render('Dashboard/Index', [barData]);
});
Затем вы либо посетите domain.com/dashboard/foo
или domain.com/dashboard/bar
Подход #2
Имея такое же представление макета, но передавая компонент "tab-view". Вы вообще не переключаете маршруты и не предоставляете один компонент представления вкладок с реквизитами для рендеринга трех разных вкладок.
В зависимости от данных этот подход может быть медленнее, поскольку вы получаете все заранее.
С #1 вы получаете данные по запросу, и поскольку это SPA, пользователь не заметит разницы.
Еще одно преимущество №1 заключается в том, что пользователь действительно может активно посещать эту конкретную вкладку и добавлять в закладки свой URL-адрес для частого доступа. Вы можете сделать то же самое с якорями / хешами, но в конце концов вы используете SPA.
Я мог бы продолжить, но выбрал любой вариант, или, возможно, этого было достаточно, чтобы вдохновить вас.