3.9 KiB
icon | title | head.title |
---|---|---|
IconDirectory | pages | Pages directory |
Pages directory
::alert{type="info"}
The pages/
directory is optional, meaning that if you only use app.vue, vue-router
won't be included, reducing your application's bundle size.
::
Nuxt will automatically integrate Vue Router and map pages/
directory into the routes of your application.
::alert{type=warning} Unlike components, your pages must have a single root element to allow Nuxt to apply route transitions between pages. ::
Dynamic Routes
If you place anything within square brackets, it will be turned into a dynamic route parameter. You can mix and match multiple parameters and even non-dynamic text within a file name or directory.
If you need a catch-all route, you create it by using a file named like [...slug].vue
. This will match all routes under that path, and thus it doesn't support any non-dynamic text.
Example
-| pages/
---| index.vue
---| users-[group]/
-----| [id].vue
Given the example above, you can access group/id within your component via the $route
object:
<template>
{{ $route.params.group }}
{{ $route.params.id }}
</template>
Navigating to /users-admins/123
would render:
admins 123
If you want to access the route using Composition API, there is a global useRoute
function that will allow you to access the route just like this.$route
in the Options API.
<script setup>
// This import statement is optional since it's automatically imported by Nuxt.
// import { useRoute } from '#imports'
const route = useRoute()
if (route.params.group === 'admins' && !route.params.id) {
console.log('Warning! Make sure user is authenticated!')
}
</script>
Navigation
To navigate between pages of your app, you should use the <NuxtLink>
component. This component is included with Nuxt and therefore you don't have to import it as you do with other components. It is similar to the HTML <a>
tag except that instead of using a href="/about"
you use to="/about"
. If you've used vue-router
before, you can think of <NuxtLink>
as a replacement for <RouterLink>
.
A simple link to the index.vue
page in your pages
folder:
<template>
<NuxtLink to="/">Home page</NuxtLink>
</template>
The <NuxtLink>
component should be used for all internal links. That means for all links to the pages within your site you should use <NuxtLink>
. The <a>
tag should be used for all external links. That means if you have links to other websites you should use the <a>
tag for those.
<template>
<div>
<h1>Home page</h1>
<NuxtLink to="/about">
About (internal link that belongs to the Nuxt App)
</NuxtLink>
<a href="https://nuxtjs.org">External Link to another page</a>
</div>
</template>
::alert{type="info"}
If you want to know more about <RouterLink>
, read the Vue Router documentation for more information.
::
Nested Routes
We provide a semantic alias for RouterView
, the <NuxtChild>
component, for displaying the children components of a nested route.
Example:
-| pages/
---| parent/
------| child.vue
---| parent.vue
This file tree will generate these routes:
[
{
path: '/parent',
component: '~/pages/parent.vue',
name: 'parent',
children: [
{
path: 'child',
component: '~/pages/parent/child.vue',
name: 'parent-child'
}
]
}
]
To display the child.vue
component, you have to insert the <NuxtChild>
component inside pages/parent.vue
:
<template>
<div>
<h1>I am the parent view</h1>
<NuxtChild :foobar="123" />
</div>
</template>