TL;DR: how are the priorities of Vue routes (global vs child) calculated?
Quasar is a Vue framework that can bootstrap applications. I am trying to follow its suggested structure but I am not sure how Vue routing works with cascading router-view
elements.
In a bootstrapped application, the routes are defined as
import type { RouteRecordRaw } from 'vue-router';
const routes: RouteRecordRaw[] = [
{
path: '/',
component: () => import('layouts/MainLayout.vue'),
children: [{ path: '', component: () => import('pages/IndexPage.vue') }],
},
// Always leave this as last one,
// but you can also remove it
{
path: '/:catchAll(.)',
component: () => import('pages/ErrorNotFound.vue'),
},
];
export default routes;
Let's assume that we are at /
.
The first component that starts everything else (App.vue
) is
<template>
<router-view />
</template>
<script setup lang="ts">
//
</script>
So when I am at /
, the MainLayout
component is lazy loaded. This is it, I removed all other components (sidebar etc.) to just keep the part that is relevant to this question:
<template>
<q-layout view="lHh Lpr lFf">
<!-- header, sidebar ->
<q-page-container>
<router-view />
</q-page-container>
</q-layout>
</template>
So we have again <router-view />
. What is it supposed to display?
I know the answer is IndexPage.vue
and I am guessing that this is because it is a child, with a ''
path. Which other path
entries are possible for children?
If this is, say, admin
, how does <router-view />
know that it is this component that should be mounted, and not the one from this slightly expanded routes?
import type { RouteRecordRaw } from 'vue-router';
const routes: RouteRecordRaw[] = [
{
path: '/',
component: () => import('layouts/MainLayout.vue'),
children: [
{ path: '', component: () => import('pages/IndexPage.vue') },
{ path: 'admin', component: () => import('pages/AdminPage.vue') },
],
},
{
path: '/admin',
component: () => import('layouts/AnotherAdminPage.vue'),
},
// Always leave this as last one,
// but you can also remove it
{
path: '/:catchAll(.)',
component: () => import('pages/ErrorNotFound.vue'),
},
]
export default routes;
Which of AnotherAdminPage
or AdminPage
will be mounted and why?
In other words: what is the precedence when choosing routes?