multiple layout의 기본 컨셉을 dynamic component와 slot을 이용한다. 만약 다음과 같이 component를 구성하게 된다면 어떨까?
Header와 Footer 사이에 main content가 들어갈 영역은 <component :is>를 이용해서 동적으로 component가 교체될 예정인데 이 컴포넌트들은 사실 layout 들이다. 각각의 layout들은 slot을 가지고 있어서 <component :is>가 전달해준 내용을 slot에 출력하는데 이 내용은 router-view이다. 따라서 router-link에서 선택한 이동 대상 즉 진짜 content가 최종적으로는 LayoutView의 slot 영역에 출력되게 된다.
그럼 어떻게 router-link의 대상 컴포넌트에 적합한 layout을 넘겨줄 것인가?
router와 meta field
route를 작성할 때 사용하는 meta field는 사용자 정의의 여러 속성을 전달 할 수 있는데 여기에 필요한 Layout의 이름을 전달할 수 있다.
import { createRouter, createWebHistory } from 'vue-router'
// layouts
import LayoutSimple from '@/components/layout/LayoutSimple.vue'
import LayoutHF from '@/components/layout/LayoutHeaderFooter.vue'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: () => import('@/views/HomeView.vue'),
meta: { layout: LayoutSimple } //어떻게 표현할 것인가 정보를 meta로 전달
},
{
path: '/main',
component: () => import('@/views/MainView.vue'),
meta: { layout: LayoutHF } //어떻게 표현할 것인가 정보를 meta로 전달
}
]
})
export default router
dynamic component에서 meta field 사용
마지막으로 dynamic component에서 router의 meta field를 사용하는 모습을 살펴보자.